* 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


Reply via email to