Loading...
--- Libc/Libc-1725.40.4/stdio/FreeBSD/makebuf.c
+++ Libc/Libc-1534.40.2/stdio/FreeBSD/makebuf.c
@@ -55,62 +55,47 @@
#ifdef FEATURE_SMALL_STDIOBUF
# define MAXBUFSIZE (1 << 12)
#else
-# define MAXBUFSIZE (1 << 24)
+# define MAXBUFSIZE (1 << 16)
#endif
#define TTYBUFSIZE 4096
#define MAXEVPSIZE 16
static char __fallback_evp[MAXEVPSIZE];
-static char __stdin_evp[MAXEVPSIZE];
static char __stdout_evp[MAXEVPSIZE];
-static char __stderr_evp[MAXEVPSIZE];
static void
-__loadevp(const char *key, char destination[MAXEVPSIZE])
-{
- char *evp = getenv(key);
- if (evp != NULL)
+__loadevp(const char* key, char destination[MAXEVPSIZE])
+{
+ char* evp = getenv(key);
+ if (evp != NULL) {
strlcpy(destination, evp, MAXEVPSIZE);
+ } else {
+ destination[0] = '\0';
+ }
}
static void
-__evpinit(void __unused *unused)
-{
- /* NetBSD style */
+__evpinit(void* __unused unused)
+{
__loadevp("STDBUF", __fallback_evp);
- __loadevp("STDBUF0", __stdin_evp);
__loadevp("STDBUF1", __stdout_evp);
- __loadevp("STDBUF2", __stderr_evp);
- /* GNU / FreeBSD style */
- __loadevp("_STDBUF_I", __stdin_evp);
- __loadevp("_STDBUF_O", __stdout_evp);
- __loadevp("_STDBUF_E", __stderr_evp);
-}
-
-static char *
+}
+
+static char*
__getevp(int fd)
{
static os_once_t predicate;
os_once(&predicate, NULL, __evpinit);
- switch (fd) {
- case STDIN_FILENO:
- if (__stdin_evp[0] != '\0')
- return __stdin_evp;
- break;
- case STDOUT_FILENO:
- if (__stdout_evp[0] != '\0')
- return __stdout_evp;
- break;
- case STDERR_FILENO:
- if (__stderr_evp[0] != '\0')
- return __stderr_evp;
- break;
- }
- if (__fallback_evp[0] != '\0')
+ if (fd == STDOUT_FILENO && __stdout_evp[0] != '\0') {
+ return __stdout_evp;
+ } else if (__fallback_evp[0] != '\0') {
return __fallback_evp;
- return NULL;
+ } else {
+ return NULL;
+ }
+
}
/*
@@ -121,67 +106,54 @@
static int
__senvbuf(FILE *fp, size_t *bufsize, int *couldbetty)
{
- char *evp;
- int flags = 0; // default = fully buffered
- size_t size = 0;
-
- if ((evp = __getevp(fp->_file)) == NULL || *evp == '\0')
- return 0;
- /*
- * NetBSD style: [UuLlFf] followed by an optional size
- * GNU style: [0L] or a size
- * FreeBSD style: [0LB] or a size
- * Synthesis: optional [0UuLlFfB] followed by optional size.
- */
+ char* evp;
+ char* end;
+ int flags;
+ long size;
+
+ flags = 0; // Default to fully buffered
+
+ if ((evp = __getevp(fp->_file)) == NULL) {
+ return flags;
+ }
+
+ // Look at the first character only to determine buffering mode
switch (*evp) {
- case '0':
- case 'U':
- case 'u':
- evp++;
- flags = __SNBF;
- break;
- case 'L':
- case 'l':
- evp++;
- flags = __SLBF;
- break;
- case 'F':
- case 'f':
- case 'B':
- evp++;
- break;
- }
- if (flags == __SNBF && *evp != '\0')
- return 0;
- for (; isdigit((unsigned char)*evp); evp++)
- size = size * 10 + *evp - '0';
- /*
- * GNU accepts suffixes up to Z and has different notations for
- * binary and decimal. FreeBSD accepts suffixes up to G. We'll
- * settle for [Kk] and M and not bother with the distinction
- * between binary and decimal.
- */
- switch (*evp) {
- case 'M':
- evp++;
- size *= 1024 * 1024;
- break;
- case 'K':
- case 'k':
- evp++;
- size *= 1024;
- break;
- case 'B':
- case '\0':
- break;
- default:
- return 0;
- }
- if (*evp == 'B')
- evp++;
- if (*evp != '\0')
- return 0;
+ case 'u':
+ case 'U':
+ flags |= __SNBF;
+ break;
+ case 'l':
+ case 'L':
+ flags |= __SLBF;
+ break;
+ case 'f':
+ case 'F':
+ // Default flags is fully buffered
+ break;
+ default:
+ // Unexpected buffering mode, use default fully buffered
+ return flags;
+ }
+ // User specified envrionment defaults have higher priority than tty defaults
*couldbetty = 0;
+
+ // Advance the envrionment variable pointer, so we can attempt to parse the number
+ evp++;
+ if (!isdigit(*evp)) {
+ return flags; // No number found, this protects us from negative size values
+ }
+
+ size = strtol_l(evp, &end, 10, LC_C_LOCALE);
+ if (*end != '\0') {
+ return flags;
+ }
+
+ if (size <= 0) {
+ return __SNBF; // Override with unbuffered if the buffer size is 0
+ }
+
+ // We had a non zero buffer, cap it and return the flags;
*bufsize = size > MAXBUFSIZE ? MAXBUFSIZE : size;
return flags;
}
@@ -216,8 +188,6 @@
fp->_bf._size = 1;
return;
}
- if (size == 0)
- size = BUFSIZ;
}
if (couldbetty && isatty(fp->_file)) {
@@ -232,11 +202,7 @@
fp->_bf._size = 1;
return;
}
-#ifdef __APPLE__
- __cleanup = 1;
-#else
__cleanup = _cleanup;
-#endif // __APPLE__
flags |= __SMBF;
fp->_bf._base = fp->_p = p;
fp->_bf._size = size;