iliaa           Wed Jul 20 15:26:33 2005 EDT

  Added files:                 (Branch: PHP_4_4)
    /php-src/ext/standard/tests/file    bug32160.txt bug32160.phpt 

  Modified files:              
    /php-src    NEWS 
    /php-src/ext/standard       file.c 
  Log:
  MFH: Fixed bug #32160 (copying a file into itself leads to data loss).
  
  
http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1247.2.920.2.17&r2=1.1247.2.920.2.18&ty=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.1247.2.920.2.17 php-src/NEWS:1.1247.2.920.2.18
--- php-src/NEWS:1.1247.2.920.2.17      Tue Jul 19 21:45:03 2005
+++ php-src/NEWS        Wed Jul 20 15:26:30 2005
@@ -1,10 +1,11 @@
 PHP 4                                                                      NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2005, Version 4.4.1
-- Fixed bug #33648 (Using --with-regex=system causes compile failure). (Andrei)
 - Fixed bug #33673 (Added detection for partially uploaded files). (Ilia)
+- Fixed bug #33648 (Using --with-regex=system causes compile failure). (Andrei)
 - Fixed bug #33156 (cygwin version of setitimer doesn't accept ITIMER_PROF).
   (Nuno)
+- Fixed bug #32160 (copying a file into itself leads to data loss). (Ilia)
 - Fixed bug #31158 (array_splice on $GLOBALS crashes). (Dmitry)
 
 11 Jul 2005, Version 4.4.0
http://cvs.php.net/diff.php/php-src/ext/standard/file.c?r1=1.279.2.70&r2=1.279.2.70.2.1&ty=u
Index: php-src/ext/standard/file.c
diff -u php-src/ext/standard/file.c:1.279.2.70 
php-src/ext/standard/file.c:1.279.2.70.2.1
--- php-src/ext/standard/file.c:1.279.2.70      Sun Mar 27 10:53:59 2005
+++ php-src/ext/standard/file.c Wed Jul 20 15:26:31 2005
@@ -21,7 +21,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: file.c,v 1.279.2.70 2005/03/27 15:53:59 iliaa Exp $ */
+/* $Id: file.c,v 1.279.2.70.2.1 2005/07/20 19:26:31 iliaa Exp $ */
 
 /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */
 
@@ -2141,6 +2141,56 @@
 {
        php_stream *srcstream = NULL, *deststream = NULL;
        int ret = FAILURE;
+       php_stream_statbuf src_s, dest_s;
+
+       switch (php_stream_stat_path(src, &src_s)) {
+               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(dest, &dest_s) != 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,

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

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)

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to