lbarnaud                Sun Apr 19 17:09:47 2009 UTC

  Modified files:              
    /php-src/ext/standard       file.c streamsfuncs.c 
    /php-src/main       php_streams.h 
    /php-src/main/streams       cast.c streams.c 
  Log:
  Better fix for #47997
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/file.c?r1=1.541&r2=1.542&diff_format=u
Index: php-src/ext/standard/file.c
diff -u php-src/ext/standard/file.c:1.541 php-src/ext/standard/file.c:1.542
--- php-src/ext/standard/file.c:1.541   Sun Apr 19 13:50:24 2009
+++ php-src/ext/standard/file.c Sun Apr 19 17:09:46 2009
@@ -21,7 +21,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: file.c,v 1.541 2009/04/19 13:50:24 lbarnaud Exp $ */
+/* $Id: file.c,v 1.542 2009/04/19 17:09:46 lbarnaud Exp $ */
 
 /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */
 
@@ -661,12 +661,15 @@
        }
 
        switch (Z_TYPE_P(data)) {
-               case IS_RESOURCE:
-                       numchars = (int) 
php_stream_copy_to_stream_ex(srcstream, stream, PHP_STREAM_COPY_ALL);
-                       if ((size_t)numchars == PHP_STREAM_FAILURE) {
+               case IS_RESOURCE: {
+                       size_t len;
+                       if (php_stream_copy_to_stream_ex(srcstream, stream, 
PHP_STREAM_COPY_ALL, &len) != SUCCESS) {
                                numchars = -1;
+                       } else {
+                               numchars = len;
                        }
                        break;
+               }
                case IS_ARRAY:
                        if (zend_hash_num_elements(Z_ARRVAL_P(data))) {
                                zval **tmp;
@@ -1952,7 +1955,7 @@
        deststream = php_stream_open_wrapper(dest, "wb", REPORT_ERRORS, NULL);
 
        if (srcstream && deststream) {
-               ret = php_stream_copy_to_stream_ex(srcstream, deststream, 
PHP_STREAM_COPY_ALL) == PHP_STREAM_FAILURE ? FAILURE : SUCCESS;
+               ret = php_stream_copy_to_stream_ex(srcstream, deststream, 
PHP_STREAM_COPY_ALL, NULL);
        }
        if (srcstream) {
                php_stream_close(srcstream);
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/streamsfuncs.c?r1=1.137&r2=1.138&diff_format=u
Index: php-src/ext/standard/streamsfuncs.c
diff -u php-src/ext/standard/streamsfuncs.c:1.137 
php-src/ext/standard/streamsfuncs.c:1.138
--- php-src/ext/standard/streamsfuncs.c:1.137   Sun Apr 19 13:50:24 2009
+++ php-src/ext/standard/streamsfuncs.c Sun Apr 19 17:09:46 2009
@@ -17,7 +17,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: streamsfuncs.c,v 1.137 2009/04/19 13:50:24 lbarnaud Exp $ */
+/* $Id: streamsfuncs.c,v 1.138 2009/04/19 17:09:46 lbarnaud Exp $ */
 
 #include "php.h"
 #include "php_globals.h"
@@ -458,7 +458,8 @@
        php_stream *src, *dest;
        zval *zsrc, *zdest;
        long maxlen = PHP_STREAM_COPY_ALL, pos = 0;
-       size_t ret;
+       size_t len;
+       int ret;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr|ll", &zsrc, 
&zdest, &maxlen, &pos) == FAILURE) {
                RETURN_FALSE;
@@ -472,12 +473,12 @@
                RETURN_FALSE;
        }
 
-       ret = php_stream_copy_to_stream_ex(src, dest, maxlen);
+       ret = php_stream_copy_to_stream_ex(src, dest, maxlen, &len);
 
-       if (ret == PHP_STREAM_FAILURE) {
+       if (ret != SUCCESS) {
                RETURN_FALSE;
        }
-       RETURN_LONG(ret);
+       RETURN_LONG(len);
 }
 /* }}} */
 
http://cvs.php.net/viewvc.cgi/php-src/main/php_streams.h?r1=1.141&r2=1.142&diff_format=u
Index: php-src/main/php_streams.h
diff -u php-src/main/php_streams.h:1.141 php-src/main/php_streams.h:1.142
--- php-src/main/php_streams.h:1.141    Sun Apr 19 13:50:25 2009
+++ php-src/main/php_streams.h  Sun Apr 19 17:09:46 2009
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_streams.h,v 1.141 2009/04/19 13:50:25 lbarnaud Exp $ */
+/* $Id: php_streams.h,v 1.142 2009/04/19 17:09:46 lbarnaud Exp $ */
 
 #ifndef PHP_STREAMS_H
 #define PHP_STREAMS_H
@@ -525,8 +525,6 @@
  * 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_ucopy_to_stream(php_stream *src, php_stream *dest, 
size_t maxlen, size_t maxchars STREAMS_DC TSRMLS_DC);
@@ -537,12 +535,12 @@
                ? _php_stream_copy_to_stream((src), (dest), (maxlen) STREAMS_CC 
TSRMLS_CC) \
                : _php_stream_ucopy_to_stream((src), (dest), -1, (maxlen) 
STREAMS_CC TSRMLS_CC) )
 
-PHPAPI size_t _php_stream_ucopy_to_stream_ex(php_stream *src, php_stream 
*dest, size_t maxlen, size_t maxchars STREAMS_DC TSRMLS_DC);
-PHPAPI size_t _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, 
size_t maxlen STREAMS_DC TSRMLS_DC);
+PHPAPI size_t _php_stream_ucopy_to_stream_ex(php_stream *src, php_stream 
*dest, size_t maxlen, size_t maxchars, size_t *len STREAMS_DC TSRMLS_DC);
+PHPAPI size_t _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, 
size_t maxlen, size_t *len STREAMS_DC TSRMLS_DC);
 /* Preserve "characters" semantics by having maxlen refer to maxchars in a 
unicode context */
-#define php_stream_copy_to_stream_ex(src, dest, maxlen)        ( 
((src)->readbuf_type == IS_STRING) \
-               ? _php_stream_copy_to_stream_ex((src), (dest), (maxlen) 
STREAMS_CC TSRMLS_CC) \
-               : _php_stream_ucopy_to_stream_ex((src), (dest), -1, (maxlen) 
STREAMS_CC TSRMLS_CC) )
+#define php_stream_copy_to_stream_ex(src, dest, maxlen, len)   ( 
((src)->readbuf_type == IS_STRING) \
+               ? _php_stream_copy_to_stream_ex((src), (dest), (maxlen), (len) 
STREAMS_CC TSRMLS_CC) \
+               : _php_stream_ucopy_to_stream_ex((src), (dest), -1, (maxlen), 
(len) STREAMS_CC TSRMLS_CC) )
 
 /* read all data from stream and put into a buffer. Caller must free buffer 
when done.
  * The copy will use mmap if available. */
http://cvs.php.net/viewvc.cgi/php-src/main/streams/cast.c?r1=1.21&r2=1.22&diff_format=u
Index: php-src/main/streams/cast.c
diff -u php-src/main/streams/cast.c:1.21 php-src/main/streams/cast.c:1.22
--- php-src/main/streams/cast.c:1.21    Sun Apr 19 13:50:25 2009
+++ php-src/main/streams/cast.c Sun Apr 19 17:09:47 2009
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: cast.c,v 1.21 2009/04/19 13:50:25 lbarnaud Exp $ */
+/* $Id: cast.c,v 1.22 2009/04/19 17:09: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_ex(stream, newstream, PHP_STREAM_COPY_ALL);
+                               int ret = php_stream_copy_to_stream_ex(stream, 
newstream, PHP_STREAM_COPY_ALL, NULL);
 
-                               if (copied == PHP_STREAM_FAILURE) {
+                               if (ret != SUCCESS) {
                                        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_ex(origstream, *newstream, 
PHP_STREAM_COPY_ALL) == PHP_STREAM_FAILURE) {
+       if (php_stream_copy_to_stream_ex(origstream, *newstream, 
PHP_STREAM_COPY_ALL, NULL) != SUCCESS) {
                php_stream_close(*newstream);
                *newstream = NULL;
                return PHP_STREAM_CRITICAL;
http://cvs.php.net/viewvc.cgi/php-src/main/streams/streams.c?r1=1.182&r2=1.183&diff_format=u
Index: php-src/main/streams/streams.c
diff -u php-src/main/streams/streams.c:1.182 
php-src/main/streams/streams.c:1.183
--- php-src/main/streams/streams.c:1.182        Sun Apr 19 13:50:25 2009
+++ php-src/main/streams/streams.c      Sun Apr 19 17:09:47 2009
@@ -19,7 +19,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: streams.c,v 1.182 2009/04/19 13:50:25 lbarnaud Exp $ */
+/* $Id: streams.c,v 1.183 2009/04/19 17:09:47 lbarnaud Exp $ */
 
 #define _GNU_SOURCE
 #include "php.h"
@@ -1768,18 +1768,24 @@
 }
 
 /* Designed for copying UChars (taking into account both maxlen and maxchars) 
*/
-PHPAPI size_t _php_stream_ucopy_to_stream_ex(php_stream *src, php_stream 
*dest, size_t maxlen, size_t maxchars STREAMS_DC TSRMLS_DC)
+PHPAPI size_t _php_stream_ucopy_to_stream_ex(php_stream *src, php_stream 
*dest, size_t maxlen, size_t maxchars, size_t *len STREAMS_DC TSRMLS_DC)
 {
        size_t haveread = 0;
        php_stream_statbuf ssbuf;
+       size_t dummy;
+
+       if (!len) {
+               len = &dummy;
+       }
 
        if (src->readbuf_type == IS_STRING) {
                /* Called incorrectly, don't do that. */
-               return _php_stream_copy_to_stream_ex(src, dest, maxlen 
STREAMS_CC TSRMLS_CC);
+               return _php_stream_copy_to_stream_ex(src, dest, maxlen, len 
STREAMS_CC TSRMLS_CC);
        }
 
        if (maxlen == 0 || maxchars == 0) {
-               return 0;
+               *len = 0;
+               return SUCCESS;
        }
 
        if (maxlen == PHP_STREAM_COPY_ALL) {
@@ -1795,7 +1801,8 @@
                 && !S_ISCHR(ssbuf.sb.st_mode)
 #endif
                ) {
-                       return 0;
+                       *len = 0;
+                       return SUCCESS;
                }
        }
 
@@ -1827,7 +1834,8 @@
                        while(towrite) {
                                didwrite = php_stream_write_unicode(dest, 
writeptr, towrite);
                                if (didwrite == 0) {
-                                       return PHP_STREAM_FAILURE;
+                                       *len = haveread - (didread - towrite);
+                                       return FAILURE;
                                }
 
                                towrite -= didwrite;
@@ -1841,41 +1849,50 @@
                        break;
                }
        }
+       
+       *len = haveread;
 
        /* we've got at least 1 byte to read. 
         * less than 1 is an error */
 
        if (haveread > 0) {
-               return haveread;
+               return SUCCESS;
        }
-       return PHP_STREAM_FAILURE;
+       return FAILURE;
 }
 
 /* see _php_stream_copy_to_stream() */
 ZEND_ATTRIBUTE_DEPRECATED
 PHPAPI size_t _php_stream_ucopy_to_stream(php_stream *src, php_stream *dest, 
size_t maxlen, size_t maxchars STREAMS_DC TSRMLS_DC)
 {
-       size_t ret = _php_stream_ucopy_to_stream_ex(src, dest, maxlen, maxchars 
STREAMS_REL_CC TSRMLS_CC);
-       if (ret == 0 && maxlen != 0 && maxchars != 0) {
+       size_t len;
+       int ret = _php_stream_ucopy_to_stream_ex(src, dest, maxlen, maxchars, 
&len STREAMS_REL_CC TSRMLS_CC);
+       if (ret == SUCCESS && maxlen != 0 && maxchars != 0) {
                return 1;
        }
-       return ret;
+       return len;
 }
 
 /* Optimized for copying octets from source stream */
-/* 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)
+/* Returns SUCCESS/FAILURE and sets *len to the number of bytes moved */
+PHPAPI size_t _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, 
size_t maxlen, size_t *len STREAMS_DC TSRMLS_DC)
 {
        size_t haveread = 0;
        php_stream_statbuf ssbuf;
+       size_t dummy;
+
+       if (!len) {
+               len = &dummy;
+       }
 
        if (src->readbuf_type == IS_UNICODE) {
                /* Called incorrectly, don't do that. */
-               return _php_stream_ucopy_to_stream_ex(src, dest, maxlen, -1 
STREAMS_CC TSRMLS_CC);
+               return _php_stream_ucopy_to_stream_ex(src, dest, maxlen, -1, 
len STREAMS_CC TSRMLS_CC);
        }
 
        if (maxlen == 0) {
-               return 0;
+               *len = 0;
+               return SUCCESS;
        }
 
        if (maxlen == PHP_STREAM_COPY_ALL) {
@@ -1891,7 +1908,8 @@
                 && !S_ISCHR(ssbuf.sb.st_mode)
 #endif
                ) {
-                       return 0;
+                       *len = 0;
+                       return SUCCESS;
                }
        }
 
@@ -1905,14 +1923,16 @@
                        mapped = php_stream_write(dest, p, mapped);
 
                        php_stream_mmap_unmap(src);
+
+                       *len = mapped;
                        
                        /* we've got at least 1 byte to read. 
                         * less than 1 is an error */
 
                        if (mapped > 0) {
-                               return mapped;
+                               return SUCCESS;
                        }
-                       return PHP_STREAM_FAILURE;
+                       return FAILURE;
                }
        }
 
@@ -1939,7 +1959,8 @@
                        while(towrite) {
                                didwrite = php_stream_write(dest, writeptr, 
towrite);
                                if (didwrite == 0) {
-                                       return PHP_STREAM_FAILURE;
+                                       *len = haveread - (didread - towrite);
+                                       return FAILURE;
                                }
 
                                towrite -= didwrite;
@@ -1954,13 +1975,15 @@
                }
        }
 
+       *len = haveread;
+
        /* we've got at least 1 byte to read. 
         * less than 1 is an error */
 
        if (haveread > 0) {
-               return haveread;
+               return SUCCESS;
        }
-       return PHP_STREAM_FAILURE;
+       return FAILURE;
 }
 
 /* Returns the number of bytes moved.
@@ -1969,11 +1992,12 @@
 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) {
+       size_t len;
+       int ret = _php_stream_copy_to_stream_ex(src, dest, maxlen, &len 
STREAMS_REL_CC TSRMLS_CC);
+       if (ret == SUCCESS && len == 0 && maxlen != 0) {
                return 1;
        }
-       return ret;
+       return len;
 }
 /* }}} */
 

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

Reply via email to