---- makebuf.c.orig 2006-10-11 20:54:06.000000000 -0700
-+++ makebuf.c 2006-10-12 10:09:09.000000000 -0700
-@@ -49,6 +49,8 @@
+--- makebuf.c.bsdnew 2009-11-11 13:33:12.000000000 -0800
++++ makebuf.c 2009-11-11 13:33:13.000000000 -0800
+@@ -47,6 +47,9 @@ __FBSDID("$FreeBSD: src/lib/libc/stdio/m
+ #include "libc_private.h"
#include "local.h"
- #include "un-namespace.h"
++#define MAXBUFSIZE (1 << 16)
+#define TTYBUFSIZE 4096
+
/*
* Allocate a file buffer, or switch to unbuffered I/O.
* Per the ANSI C standard, ALL tty devices default to line buffered.
-@@ -71,6 +73,12 @@
+@@ -69,6 +72,12 @@ __smakebuf(fp)
return;
}
flags = __swhatbuf(fp, &size, &couldbetty);
if ((p = malloc(size)) == NULL) {
fp->_flags |= __SNBF;
fp->_bf._base = fp->_p = fp->_nbuf;
-@@ -81,8 +89,6 @@
+@@ -79,8 +88,6 @@ __smakebuf(fp)
flags |= __SMBF;
fp->_bf._base = fp->_p = p;
fp->_bf._size = size;
fp->_flags |= flags;
}
+@@ -113,8 +120,7 @@ __swhatbuf(fp, bufsize, couldbetty)
+ * __sseek is mainly paranoia.) It is safe to set _blksize
+ * unconditionally; it will only be used if __SOPT is also set.
+ */
+- *bufsize = st.st_blksize;
+- fp->_blksize = st.st_blksize;
++ fp->_blksize = *bufsize = st.st_blksize > MAXBUFSIZE ? MAXBUFSIZE : st.st_blksize;
+ return ((st.st_mode & S_IFMT) == S_IFREG && fp->_seek == __sseek ?
+ __SOPT : __SNPT);
+ }