X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=src%2Futils.c;h=3c873d0e88df692d699774e613bf2534a4e85a0e;hb=311f76645f7637d295f2152b90fe8b3d5495706b;hp=3fd1435ec20d59326d20078006fbfacb02aeecfb;hpb=9ce3a8c0c81f9ee44ef51f6fce80588b839efc69;p=wget 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 */