summaryrefslogtreecommitdiff
path: root/libio
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2009-02-18 15:49:44 +0000
committerJakub Jelinek <jakub@redhat.com>2009-02-18 15:49:44 +0000
commitcf22c5c9b3a4a6cc81a269d49d2324b5df084d74 (patch)
treeca7e374c348baf4e6510329f3f271eca4eb5419f /libio
parent73c5dd45bc405428148ee740cac61a1279fe57d4 (diff)
Updated to fedora-glibc-20090218T1534
Diffstat (limited to 'libio')
-rw-r--r--libio/wfileops.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/libio/wfileops.c b/libio/wfileops.c
index c5f0eaf6a7..57ed786a8f 100644
--- a/libio/wfileops.c
+++ b/libio/wfileops.c
@@ -297,14 +297,34 @@ _IO_wfile_underflow (fp)
if (naccbuf == 0)
{
+ if (fp->_IO_read_base < fp->_IO_read_ptr)
+ {
+ /* Partially used the buffer for some input data that
+ produces no output. */
+ size_t avail = fp->_IO_read_end - fp->_IO_read_ptr;
+ memmove (fp->_IO_read_base, fp->_IO_read_ptr, avail);
+ fp->_IO_read_ptr = fp->_IO_read_base;
+ fp->_IO_read_end -= avail;
+ goto again;
+ }
naccbuf = fp->_IO_read_end - fp->_IO_read_ptr;
if (naccbuf >= sizeof (accbuf))
goto out_eilseq;
memcpy (accbuf, fp->_IO_read_ptr, naccbuf);
}
- else if (naccbuf == sizeof (accbuf))
- goto out_eilseq;
+ else
+ {
+ size_t used = read_ptr_copy - accbuf;
+ if (used > 0)
+ {
+ memmove (accbuf, read_ptr_copy, naccbuf - used);
+ naccbuf -= used;
+ }
+
+ if (naccbuf == sizeof (accbuf))
+ goto out_eilseq;
+ }
fp->_IO_read_ptr = fp->_IO_read_end = fp->_IO_read_base;