Author: chromatic
Date: Thu Nov 27 10:06:23 2008
New Revision: 33268

Modified:
   trunk/src/io/buffer.c

Log:
[IO] Really made sure that the string length produced in
Parrot_io_peek_buffer() is never negative (see r33248 and CID #148 from
Coverity Scan).

Modified: trunk/src/io/buffer.c
==============================================================================
--- trunk/src/io/buffer.c       (original)
+++ trunk/src/io/buffer.c       Thu Nov 27 10:06:23 2008
@@ -331,31 +331,34 @@
     /* (re)fill the readbuffer */
     if (!(buffer_flags & PIO_BF_READBUF)) {
         size_t got;
+
         if (len >= Parrot_io_get_buffer_size(interp, filehandle)) {
-            STRING fake;
+            STRING  fake;
             STRING *sf = &fake;
 
             fake.strstart = (char *)out_buf;
             fake.bufused  = len;
-            got = PIO_READ(interp, filehandle, &sf);
-            s->strlen = s->bufused = current + got;
-            Parrot_io_set_file_position(interp, filehandle, (got +
-                    Parrot_io_get_file_position(interp, filehandle)));
+            got           = PIO_READ(interp, filehandle, &sf);
+            s->strlen     = s->bufused = current + got;
+
+            Parrot_io_set_file_position(interp, filehandle,
+                    (got + Parrot_io_get_file_position(interp, filehandle)));
             return current + got;
         }
 
         got = Parrot_io_fill_readbuf(interp, filehandle);
-
         len = len < got ? len : got;
     }
 
     /* read from the read_buffer */
+
     memcpy(out_buf, buffer_next, len);
-    s->strlen = s->bufused = current + len;
+    s->strlen    = s->bufused = current + len;
     buffer_next += len;
+
     Parrot_io_set_buffer_next(interp, filehandle, buffer_next);
-    Parrot_io_set_file_position(interp, filehandle, (len +
-            Parrot_io_get_file_position(interp, filehandle)));
+    Parrot_io_set_file_position(interp, filehandle,
+            (len + Parrot_io_get_file_position(interp, filehandle)));
 
     /* is the buffer is completely empty ? */
     if (buffer_next == buffer_end) {
@@ -365,6 +368,7 @@
         Parrot_io_set_buffer_end(interp, filehandle, NULL);
         Parrot_io_set_buffer_next(interp, filehandle, buffer_start);
     }
+
     return current + len;
 }
 
@@ -417,8 +421,11 @@
             Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_PIO_ERROR,
                 "Can't peek at unbuffered I/O");
 
+        /* Parrot_io_fill_readbuf() can return -1, but len should be positive 
*/
         got = Parrot_io_fill_readbuf(interp, filehandle);
-        len = (len < got) ? len : got;
+        len = (len < got)
+            ? len
+            : (got > 0) ? got : 0;
     }
 
     /* if we got any data, then copy out the next byte */

Reply via email to