]> granicus.if.org Git - php/commitdiff
Correct a buglet in the newly introduced buffer code.
authorWez Furlong <wez@php.net>
Mon, 23 Sep 2002 23:39:46 +0000 (23:39 +0000)
committerWez Furlong <wez@php.net>
Mon, 23 Sep 2002 23:39:46 +0000 (23:39 +0000)
# Andi: this might have been the cause of that problem you mentioned.

main/streams.c

index ef37fb4a35aa769bf109105f92749fe4ff1c89f6..b798b3dd161e81fa9927f1869324445503dfcaa4 100755 (executable)
@@ -355,7 +355,8 @@ static void php_stream_fill_read_buffer(php_stream *stream, size_t size TSRMLS_D
                                        stream->readbuflen - stream->writepos
                                        TSRMLS_CC);
                }
-               if (justread == 0)
+               
+               if (justread <= 0)
                        break;
                stream->writepos += justread;
        }
@@ -363,15 +364,15 @@ static void php_stream_fill_read_buffer(php_stream *stream, size_t size TSRMLS_D
 
 PHPAPI size_t _php_stream_read(php_stream *stream, char *buf, size_t size TSRMLS_DC)
 {
-       size_t avail, toread, didread = 0;
+       size_t toread, didread = 0;
        
        /* take from the read buffer first.
         * It is possible that a buffered stream was switched to non-buffered, so we
         * drain the remainder of the buffer before using the "raw" read mode for
         * the excess */
-       avail = stream->writepos - stream->readpos;
-       if (avail) {
-               toread = avail;
+       if (stream->writepos > stream->readpos) {
+               
+               toread = stream->writepos - stream->readpos;
                if (toread > size)
                        toread = size;
 
@@ -379,7 +380,7 @@ PHPAPI size_t _php_stream_read(php_stream *stream, char *buf, size_t size TSRMLS
                stream->readpos += toread;
                size -= toread;
                buf += toread;
-               didread += size;
+               didread += toread;
        }
 
        if (size == 0)
@@ -398,10 +399,12 @@ PHPAPI size_t _php_stream_read(php_stream *stream, char *buf, size_t size TSRMLS
 
                if ((off_t)size > stream->writepos - stream->readpos)
                        size = stream->writepos - stream->readpos;
-
-               memcpy(buf, stream->readbuf + stream->readpos, size);
-               stream->readpos += size;
-               didread += size;
+               
+               if (size) {
+                       memcpy(buf, stream->readbuf + stream->readpos, size);
+                       stream->readpos += size;
+                       didread += size;
+               }
        }
        stream->position += size;
        return didread;