* src/libstdbuf.c (apply_mode): Be more conservative about sizes passed to malloc, since we can’t rely on Gnulib malloc. --- src/libstdbuf.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/libstdbuf.c b/src/libstdbuf.c index 2b4dbe1f2..51665bd5a 100644 --- a/src/libstdbuf.c +++ b/src/libstdbuf.c @@ -94,8 +94,11 @@ apply_mode (FILE *stream, char const *stream_name, char const *envvar) return; } - buf = (size <= ((unsigned long int) -2 < (size_t) -1 - ? (unsigned long int) -2 : (size_t) -1) + /* If strtoul might have overflowed or if the size is more than + half of size_t range, treat it as an allocation failure. + Huge sizes can cause problems with some stdio implementations. */ + buf = (size <= ((unsigned long int) -2 < (size_t) -1 / 2 + ? (unsigned long int) -2 : (size_t) -1 / 2) ? malloc (size) : nullptr); if (!buf) { -- 2.48.1