* 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