diff options
author | Elliott Hughes <enh@google.com> | 2014-12-01 16:13:30 -0800 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2014-12-02 14:54:52 -0800 |
commit | 27d276f3a6d81d29fab13de96496efb7bc072773 (patch) | |
tree | f15aacb70521bf895148e9741387c70f708e7c41 /libc | |
parent | 152e978f73fc6cd37d0d82de69f1cf8134b34b90 (diff) | |
download | bionic-27d276f3a6d81d29fab13de96496efb7bc072773.zip bionic-27d276f3a6d81d29fab13de96496efb7bc072773.tar.gz bionic-27d276f3a6d81d29fab13de96496efb7bc072773.tar.bz2 |
Avoid pathological behavior in OpenBSD's fread.
(cherry picked from commit 20841a137beac5caa824e3586c7bd91d879ff92e)
Bug: https://code.google.com/p/android/issues/detail?id=81155
Bug: 18556607
Change-Id: Ibdfebc20dce4c34ad565014523c9b074e90ea665
Diffstat (limited to 'libc')
-rw-r--r-- | libc/Android.mk | 2 | ||||
-rw-r--r-- | libc/stdio/fread.c (renamed from libc/upstream-openbsd/lib/libc/stdio/fread.c) | 18 |
2 files changed, 18 insertions, 2 deletions
diff --git a/libc/Android.mk b/libc/Android.mk index 045556e..3005092 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -61,6 +61,7 @@ libc_common_src_files := \ bionic/sigsetmask.c \ bionic/system_properties_compat.c \ stdio/findfp.c \ + stdio/fread.c \ stdio/snprintf.c\ stdio/sprintf.c \ @@ -396,7 +397,6 @@ libc_upstream_openbsd_src_files := \ upstream-openbsd/lib/libc/stdio/fputs.c \ upstream-openbsd/lib/libc/stdio/fputwc.c \ upstream-openbsd/lib/libc/stdio/fputws.c \ - upstream-openbsd/lib/libc/stdio/fread.c \ upstream-openbsd/lib/libc/stdio/freopen.c \ upstream-openbsd/lib/libc/stdio/fscanf.c \ upstream-openbsd/lib/libc/stdio/fseek.c \ diff --git a/libc/upstream-openbsd/lib/libc/stdio/fread.c b/libc/stdio/fread.c index 8a592f6..e052128 100644 --- a/libc/upstream-openbsd/lib/libc/stdio/fread.c +++ b/libc/stdio/fread.c @@ -68,7 +68,23 @@ fread(void *buf, size_t size, size_t count, FILE *fp) fp->_r = 0; total = resid; p = buf; - while (resid > (r = fp->_r)) { + + // BEGIN android-added + // Avoid pathological behavior on unbuffered files. OpenBSD + // will loop reading one byte then memcpying one byte! + if ((fp->_flags & __SNBF) != 0) { + // We know if we're unbuffered that our buffer is empty, so + // we can just read directly. + while (resid > 0 && (r = (*fp->_read)(fp->_cookie, p, resid)) > 0) { + p += r; + resid -= r; + } + FUNLOCKFILE(fp); + return ((total - resid) / size); + } + // END android-added + + while (resid > (size_t)(r = fp->_r)) { (void)memcpy((void *)p, (void *)fp->_p, (size_t)r); fp->_p += r; /* fp->_r = 0 ... done in __srefill */ |