diff options
author | Ulrich Drepper <drepper@redhat.com> | 2009-02-05 00:21:43 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2009-02-05 00:21:43 +0000 |
commit | a71433e7fd0263a1dbac7a9b88067e4830382486 (patch) | |
tree | 7e19d61caa3a7f16c63ac637fc23d32a2f61e4f6 /libio/wfileops.c | |
parent | 82f2e9c6bd8a02b6b5d90239f0f683407a5a7d10 (diff) | |
download | glibc-a71433e7fd0263a1dbac7a9b88067e4830382486.zip glibc-a71433e7fd0263a1dbac7a9b88067e4830382486.tar.gz glibc-a71433e7fd0263a1dbac7a9b88067e4830382486.tar.bz2 |
* sysdeps/unix/sysv/linux/sparc/bits/siginfo.h (struct sigevent):
Add _tid slot to maintain consistency with kernel.
Diffstat (limited to 'libio/wfileops.c')
-rw-r--r-- | libio/wfileops.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/libio/wfileops.c b/libio/wfileops.c index c5f0eaf..57ed786 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; |