iliaa Wed Jun 22 12:13:48 2005 EDT
Added files:
/php-src/ext/standard/tests/file bug32160.phpt bug32160.txt
Modified files:
/php-src NEWS
/php-src/ext/standard file.c
Log:
Fixed bug #32160 (copying a file into itself leads to data loss).
http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1949&r2=1.1950&ty=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.1949 php-src/NEWS:1.1950
--- php-src/NEWS:1.1949 Wed Jun 22 11:26:05 2005
+++ php-src/NEWS Wed Jun 22 12:13:44 2005
@@ -43,6 +43,7 @@
- Fixed bug #31256 (PHP_EVAL_LIBLINE configure macro does not handle -pthread).
(Jani)
- Fixed bug #31213 (Sideeffects caused by fix of bug #29493). (Dmitry)
+- Fixed bug #32160 (copying a file into itself leads to data loss). (Ilia)
- Fixed bug #31054 (safe_mode & open_basedir checks only check first
include_path value). (Ilia)
- Fixed bug #29683 (headers_list() returns empty array). (Tony)
http://cvs.php.net/diff.php/php-src/ext/standard/file.c?r1=1.406&r2=1.407&ty=u
Index: php-src/ext/standard/file.c
diff -u php-src/ext/standard/file.c:1.406 php-src/ext/standard/file.c:1.407
--- php-src/ext/standard/file.c:1.406 Wed Apr 6 09:57:30 2005
+++ php-src/ext/standard/file.c Wed Jun 22 12:13:47 2005
@@ -21,7 +21,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: file.c,v 1.406 2005/04/06 13:57:30 iliaa Exp $ */
+/* $Id: file.c,v 1.407 2005/06/22 16:13:47 iliaa Exp $ */
/* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */
@@ -1700,6 +1700,56 @@
{
php_stream *srcstream = NULL, *deststream = NULL;
int ret = FAILURE;
+ php_stream_statbuf src_s, dest_s;
+
+ switch (php_stream_stat_path_ex(src, 0, &src_s, NULL)) {
+ case -1:
+ /* non-statable stream */
+ goto safe_to_copy;
+ break;
+ case 0:
+ break;
+ default: /* failed to stat file, does not exist? */
+ return ret;
+ }
+ if (php_stream_stat_path_ex(dest, PHP_STREAM_URL_STAT_QUIET, &dest_s,
NULL) != 0) {
+ goto safe_to_copy;
+ }
+ if (!src_s.sb.st_ino || !dest_s.sb.st_ino) {
+ goto no_stat;
+ }
+ if (src_s.sb.st_ino == dest_s.sb.st_ino && src_s.sb.st_dev ==
dest_s.sb.st_dev) {
+ return ret;
+ } else {
+ goto safe_to_copy;
+ }
+no_stat:
+ {
+ char *sp, *dp;
+ int res;
+
+ if ((sp = expand_filepath(src, NULL TSRMLS_CC)) == NULL) {
+ return ret;
+ }
+ if ((dp = expand_filepath(dest, NULL TSRMLS_CC)) == NULL) {
+ efree(sp);
+ goto safe_to_copy;
+ }
+
+ res =
+#ifndef PHP_WIN32
+ !strcmp(sp, dp);
+#else
+ !strcasecmp(sp, dp);
+#endif
+
+ efree(sp);
+ efree(dp);
+ if (res) {
+ return ret;
+ }
+ }
+safe_to_copy:
srcstream = php_stream_open_wrapper(src, "rb",
STREAM_DISABLE_OPEN_BASEDIR | REPORT_ERRORS, NULL);
http://cvs.php.net/co.php/php-src/ext/standard/tests/file/bug32160.phpt?r=1.1&p=1
Index: php-src/ext/standard/tests/file/bug32160.phpt
+++ php-src/ext/standard/tests/file/bug32160.phpt
--TEST--
Bug #32160 (copying a file into itself leads to data loss)
--FILE--
<?php
$path = dirname(__FILE__) . "/bug32160.txt";
var_dump(copy($path, $path));
chdir(dirname(__FILE__));
var_dump(copy($path, "bug32160.txt"));
var_dump(copy("bug32160.txt", "bug32160.txt"));
?>
--EXPECT--
bool(false)
bool(false)
bool(false)
http://cvs.php.net/co.php/php-src/ext/standard/tests/file/bug32160.txt?r=1.1&p=1
Index: php-src/ext/standard/tests/file/bug32160.txt
+++ php-src/ext/standard/tests/file/bug32160.txt
copy test
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php