lbarnaud                Sun Apr 19 13:46:47 2009 UTC

  Modified files:              (Branch: PHP_5_3)
    /php-src    NEWS 
    /php-src/ext/standard       file.c streamsfuncs.c 
    /php-src/main       php_streams.h 
    /php-src/main/streams       cast.c streams.c 
  Log:
  Fixed bug #47997 (stream_copy_to_stream returns 1 on empty streams)
  
  
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.965.2.560&r2=1.2027.2.547.2.965.2.561&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.965.2.560 
php-src/NEWS:1.2027.2.547.2.965.2.561
--- php-src/NEWS:1.2027.2.547.2.965.2.560       Thu Apr 16 10:16:26 2009
+++ php-src/NEWS        Sun Apr 19 13:46:46 2009
@@ -12,6 +12,7 @@
   disable this behaviour using "http"=>array("auto_decode"=>0) in stream
   context. (Dmitry)
 
+- Fixed bug #47997 (stream_copy_to_stream returns 1 on empty streams). (Arnaud)
 - Fixed bug #47880 (crashes in call_user_func_array()). (Dmitry)
 - Fixed bug #47856 (stristr() converts needle to lower-case). (Ilia)
 - Fixed bug #47851 (is_callable throws fatal error). (Dmitry)
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/file.c?r1=1.409.2.6.2.28.2.29&r2=1.409.2.6.2.28.2.30&diff_format=u
Index: php-src/ext/standard/file.c
diff -u php-src/ext/standard/file.c:1.409.2.6.2.28.2.29 
php-src/ext/standard/file.c:1.409.2.6.2.28.2.30
--- php-src/ext/standard/file.c:1.409.2.6.2.28.2.29     Tue Jan 20 01:40:05 2009
+++ php-src/ext/standard/file.c Sun Apr 19 13:46:46 2009
@@ -21,7 +21,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: file.c,v 1.409.2.6.2.28.2.29 2009/01/20 01:40:05 pajoye Exp $ */
+/* $Id: file.c,v 1.409.2.6.2.28.2.30 2009/04/19 13:46:46 lbarnaud Exp $ */
 
 /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */
 
@@ -627,7 +627,10 @@
 
        switch (Z_TYPE_P(data)) {
                case IS_RESOURCE:
-                       numbytes = php_stream_copy_to_stream(srcstream, stream, 
PHP_STREAM_COPY_ALL);
+                       numbytes = (int) 
php_stream_copy_to_stream_ex(srcstream, stream, PHP_STREAM_COPY_ALL);
+                       if ((size_t)numbytes == PHP_STREAM_FAILURE) {
+                               numbytes = -1;
+                       }
                        break;
                case IS_NULL:
                case IS_LONG:
@@ -1783,7 +1786,7 @@
        deststream = php_stream_open_wrapper(dest, "wb", ENFORCE_SAFE_MODE | 
REPORT_ERRORS, NULL);
 
        if (srcstream && deststream) {
-               ret = php_stream_copy_to_stream(srcstream, deststream, 
PHP_STREAM_COPY_ALL) == 0 ? FAILURE : SUCCESS;
+               ret = php_stream_copy_to_stream_ex(srcstream, deststream, 
PHP_STREAM_COPY_ALL) == PHP_STREAM_FAILURE ? FAILURE : SUCCESS;
        }
        if (srcstream) {
                php_stream_close(srcstream);
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/streamsfuncs.c?r1=1.58.2.6.2.15.2.34&r2=1.58.2.6.2.15.2.35&diff_format=u
Index: php-src/ext/standard/streamsfuncs.c
diff -u php-src/ext/standard/streamsfuncs.c:1.58.2.6.2.15.2.34 
php-src/ext/standard/streamsfuncs.c:1.58.2.6.2.15.2.35
--- php-src/ext/standard/streamsfuncs.c:1.58.2.6.2.15.2.34      Fri Jan 23 
15:49:49 2009
+++ php-src/ext/standard/streamsfuncs.c Sun Apr 19 13:46:46 2009
@@ -17,7 +17,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: streamsfuncs.c,v 1.58.2.6.2.15.2.34 2009/01/23 15:49:49 kalle Exp $ */
+/* $Id: streamsfuncs.c,v 1.58.2.6.2.15.2.35 2009/04/19 13:46:46 lbarnaud Exp $ 
*/
 
 #include "php.h"
 #include "php_globals.h"
@@ -443,6 +443,7 @@
        php_stream *src, *dest;
        zval *zsrc, *zdest;
        long maxlen = PHP_STREAM_COPY_ALL, pos = 0;
+       size_t ret;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr|ll", &zsrc, 
&zdest, &maxlen, &pos) == FAILURE) {
                RETURN_FALSE;
@@ -456,7 +457,12 @@
                RETURN_FALSE;
        }
 
-       RETURN_LONG(php_stream_copy_to_stream(src, dest, maxlen));
+       ret = php_stream_copy_to_stream_ex(src, dest, maxlen);
+
+       if (ret == PHP_STREAM_FAILURE) {
+               RETURN_FALSE;
+       }
+       RETURN_LONG(ret);
 }
 /* }}} */
 
http://cvs.php.net/viewvc.cgi/php-src/main/php_streams.h?r1=1.103.2.1.2.4.2.8&r2=1.103.2.1.2.4.2.9&diff_format=u
Index: php-src/main/php_streams.h
diff -u php-src/main/php_streams.h:1.103.2.1.2.4.2.8 
php-src/main/php_streams.h:1.103.2.1.2.4.2.9
--- php-src/main/php_streams.h:1.103.2.1.2.4.2.8        Wed Dec 31 11:15:47 2008
+++ php-src/main/php_streams.h  Sun Apr 19 13:46:47 2009
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_streams.h,v 1.103.2.1.2.4.2.8 2008/12/31 11:15:47 sebastian Exp $ 
*/
+/* $Id: php_streams.h,v 1.103.2.1.2.4.2.9 2009/04/19 13:46:47 lbarnaud Exp $ */
 
 #ifndef PHP_STREAMS_H
 #define PHP_STREAMS_H
@@ -420,9 +420,14 @@
  * Uses mmap if the src is a plain file and at offset 0 */
 #define PHP_STREAM_COPY_ALL            ((size_t)-1)
 
+#define PHP_STREAM_FAILURE             ((size_t)-1)
+
 BEGIN_EXTERN_C()
+ZEND_ATTRIBUTE_DEPRECATED
 PHPAPI size_t _php_stream_copy_to_stream(php_stream *src, php_stream *dest, 
size_t maxlen STREAMS_DC TSRMLS_DC);
 #define php_stream_copy_to_stream(src, dest, maxlen)   
_php_stream_copy_to_stream((src), (dest), (maxlen) STREAMS_CC TSRMLS_CC)
+PHPAPI size_t _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, 
size_t maxlen STREAMS_DC TSRMLS_DC);
+#define php_stream_copy_to_stream_ex(src, dest, maxlen)        
_php_stream_copy_to_stream_ex((src), (dest), (maxlen) STREAMS_CC TSRMLS_CC)
 
 
 /* read all data from stream and put into a buffer. Caller must free buffer 
when done.
http://cvs.php.net/viewvc.cgi/php-src/main/streams/cast.c?r1=1.12.2.1.2.1.2.3&r2=1.12.2.1.2.1.2.4&diff_format=u
Index: php-src/main/streams/cast.c
diff -u php-src/main/streams/cast.c:1.12.2.1.2.1.2.3 
php-src/main/streams/cast.c:1.12.2.1.2.1.2.4
--- php-src/main/streams/cast.c:1.12.2.1.2.1.2.3        Wed Dec 31 11:15:48 2008
+++ php-src/main/streams/cast.c Sun Apr 19 13:46:47 2009
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: cast.c,v 1.12.2.1.2.1.2.3 2008/12/31 11:15:48 sebastian Exp $ */
+/* $Id: cast.c,v 1.12.2.1.2.1.2.4 2009/04/19 13:46:47 lbarnaud Exp $ */
 
 #define _GNU_SOURCE
 #include "php.h"
@@ -214,9 +214,9 @@
 
                        newstream = php_stream_fopen_tmpfile();
                        if (newstream) {
-                               size_t copied = 
php_stream_copy_to_stream(stream, newstream, PHP_STREAM_COPY_ALL);
+                               size_t copied = 
php_stream_copy_to_stream_ex(stream, newstream, PHP_STREAM_COPY_ALL);
 
-                               if (copied == 0) {
+                               if (copied == PHP_STREAM_FAILURE) {
                                        php_stream_close(newstream);
                                } else {
                                        int retcode = 
php_stream_cast(newstream, castas | flags, ret, show_err);
@@ -332,7 +332,7 @@
        (*newstream)->open_lineno = origstream->open_lineno;
 #endif
 
-       if (php_stream_copy_to_stream(origstream, *newstream, 
PHP_STREAM_COPY_ALL) == 0) {
+       if (php_stream_copy_to_stream_ex(origstream, *newstream, 
PHP_STREAM_COPY_ALL) == PHP_STREAM_FAILURE) {
                php_stream_close(*newstream);
                *newstream = NULL;
                return PHP_STREAM_CRITICAL;
http://cvs.php.net/viewvc.cgi/php-src/main/streams/streams.c?r1=1.82.2.6.2.18.2.24&r2=1.82.2.6.2.18.2.25&diff_format=u
Index: php-src/main/streams/streams.c
diff -u php-src/main/streams/streams.c:1.82.2.6.2.18.2.24 
php-src/main/streams/streams.c:1.82.2.6.2.18.2.25
--- php-src/main/streams/streams.c:1.82.2.6.2.18.2.24   Thu Mar 19 17:55:10 2009
+++ php-src/main/streams/streams.c      Sun Apr 19 13:46:47 2009
@@ -19,7 +19,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: streams.c,v 1.82.2.6.2.18.2.24 2009/03/19 17:55:10 lbarnaud Exp $ */
+/* $Id: streams.c,v 1.82.2.6.2.18.2.25 2009/04/19 13:46:47 lbarnaud Exp $ */
 
 #define _GNU_SOURCE
 #include "php.h"
@@ -1297,7 +1297,8 @@
        return len;
 }
 
-PHPAPI size_t _php_stream_copy_to_stream(php_stream *src, php_stream *dest, 
size_t maxlen STREAMS_DC TSRMLS_DC)
+/* Returns the number of bytes moved, or PHP_STREAM_FAILURE on failure. */
+PHPAPI size_t _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, 
size_t maxlen STREAMS_DC TSRMLS_DC)
 {
        char buf[CHUNK_SIZE];
        size_t readchunk;
@@ -1314,8 +1315,6 @@
        }
 
        if (php_stream_stat(src, &ssbuf) == 0) {
-               /* in the event that the source file is 0 bytes, return 1 to 
indicate success
-                * because opening the file to write had already created a copy 
*/
                if (ssbuf.sb.st_size == 0
 #ifdef S_ISFIFO
                 && !S_ISFIFO(ssbuf.sb.st_mode)
@@ -1324,7 +1323,7 @@
                 && !S_ISCHR(ssbuf.sb.st_mode)
 #endif
                ) {
-                       return 1;
+                       return 0;
                }
        }
 
@@ -1338,8 +1337,14 @@
                        mapped = php_stream_write(dest, p, mapped);
 
                        php_stream_mmap_unmap(src);
+                       
+                       /* we've got at least 1 byte to read. 
+                        * less than 1 is an error */
 
-                       return mapped;
+                       if (mapped > 0) {
+                               return mapped;
+                       }
+                       return PHP_STREAM_FAILURE;
                }
        }
 
@@ -1364,14 +1369,14 @@
                        while(towrite) {
                                didwrite = php_stream_write(dest, writeptr, 
towrite);
                                if (didwrite == 0) {
-                                       return 0;       /* error */
+                                       return PHP_STREAM_FAILURE;
                                }
 
                                towrite -= didwrite;
                                writeptr += didwrite;
                        }
                } else {
-                       return haveread;
+                       break;
                }
 
                if (maxlen - haveread == 0) {
@@ -1379,7 +1384,26 @@
                }
        }
 
-       return haveread;
+       /* we've got at least 1 byte to read. 
+        * less than 1 is an error */
+
+       if (haveread > 0) {
+               return haveread;
+       }
+       return PHP_STREAM_FAILURE;
+}
+
+/* Returns the number of bytes moved.
+ * Returns 1 when source len is 0. 
+ * Deprecated in favor of php_stream_copy_to_stream_ex() */
+ZEND_ATTRIBUTE_DEPRECATED
+PHPAPI size_t _php_stream_copy_to_stream(php_stream *src, php_stream *dest, 
size_t maxlen STREAMS_DC TSRMLS_DC)
+{
+       size_t ret = _php_stream_copy_to_stream_ex(src, dest, maxlen 
STREAMS_REL_CC TSRMLS_CC);
+       if (ret == 0 && maxlen != 0) {
+               return 1;
+       }
+       return ret;
 }
 /* }}} */
 

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

Reply via email to