From 311f76645f7637d295f2152b90fe8b3d5495706b Mon Sep 17 00:00:00 2001 From: Alexander Dergachev Date: Fri, 11 Apr 2008 23:52:57 +0400 Subject: [PATCH] * utils.c (aprintf): Now we are setting limits (1 Mb) for text buffer when we use non-C99 vsnprintf. --- src/ChangeLog | 5 +++++ src/utils.c | 17 ++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/ChangeLog b/src/ChangeLog index fddcefd4..d320f150 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2008-04-11 Alexander Dergachev + + * utils.c (aprintf): Now we are setting limits (1 Mb) for text + buffer when we use non-C99 vsnprintf. + 2008-04-10 Alexander Dergachev * xmalloc.c, xmalloc.h (memfatal): Now exported; accepts an diff --git a/src/utils.c b/src/utils.c index 3fd1435e..3c873d0e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -159,6 +159,13 @@ sepstring (const char *s) vsnprintf until the correct size is found. Since Wget also ships a fallback implementation of vsnprintf, this should be portable. */ +/* Constant is using for limits memory allocation for text buffer. + Applicable in situation when: vasprintf is not available in the system + and vsnprintf return -1 when long line is truncated (in old versions of + glibc and in other system where C99 doesn`t support) */ + +#define FMT_MAX_LENGTH 1048576 + char * aprintf (const char *fmt, ...) { @@ -202,7 +209,15 @@ aprintf (const char *fmt, ...) if (n > -1) /* C99 */ size = n + 1; /* precisely what is needed */ else - size <<= 1; /* twice the old size */ + { + if (size >= FMT_MAX_LENGTH) /* We have a huge buffer, */ + { /* maybe we have some wrong format string? */ + free (str); /* In this case we must free already allocated memory, */ + return NULL; /* and return NULL pointer... */ + } + /* else, we continue to grow our buffer. */ + size <<= 1; /* twice the old size */ + } str = xrealloc (str, size); } #endif /* not HAVE_VASPRINTF */ -- 2.39.2