Commit:    6b4148bc9705d2668dd8589009215a8eb3076f31
Author:    Remi Collet <r...@php.net>         Tue, 2 Apr 2013 16:18:26 +0200
Parents:   7b07d05917d9ff40a70bd6ecffca840e2458ea86
Branches:  PHP-5.4 PHP-5.5 master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=6b4148bc9705d2668dd8589009215a8eb3076f31

Log:
Fixed Bug #64565 copy doesn't report failure on partial copy

_php_stream_copy_to_stream_ex, when mmap is possible, doesn't check
if actually written bytes match read bytes.

Fix this (paranoid check) to be consistent with non mmap mode

Seems hard to add a unit test, as this rely on a full filesystem.

Bugs:
https://bugs.php.net/64565

Changed paths:
  M  main/streams/streams.c


Diff:
diff --git a/main/streams/streams.c b/main/streams/streams.c
index 47d86b5..39e231d 100644
--- a/main/streams/streams.c
+++ b/main/streams/streams.c
@@ -1494,7 +1494,7 @@ PHPAPI int _php_stream_copy_to_stream_ex(php_stream *src, 
php_stream *dest, size
        char buf[CHUNK_SIZE];
        size_t readchunk;
        size_t haveread = 0;
-       size_t didread;
+       size_t didread, didwrite, towrite;
        size_t dummy;
        php_stream_statbuf ssbuf;
 
@@ -1529,16 +1529,16 @@ PHPAPI int _php_stream_copy_to_stream_ex(php_stream 
*src, php_stream *dest, size
                p = php_stream_mmap_range(src, php_stream_tell(src), maxlen, 
PHP_STREAM_MAP_MODE_SHARED_READONLY, &mapped);
 
                if (p) {
-                       mapped = php_stream_write(dest, p, mapped);
+                       didwrite = php_stream_write(dest, p, mapped);
 
                        php_stream_mmap_unmap_ex(src, mapped);
 
-                       *len = mapped;
+                       *len = didwrite;
 
                        /* we've got at least 1 byte to read.
                         * less than 1 is an error */
 
-                       if (mapped > 0) {
+                       if (mapped == didwrite) {
                                return SUCCESS;
                        }
                        return FAILURE;
@@ -1556,7 +1556,6 @@ PHPAPI int _php_stream_copy_to_stream_ex(php_stream *src, 
php_stream *dest, size
 
                if (didread) {
                        /* extra paranoid */
-                       size_t didwrite, towrite;
                        char *writeptr;
 
                        towrite = didread;


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

Reply via email to