]> sjero.net Git - wget/commitdiff
Merging in the rest of Alex's bundle.
authorMicah Cowan <micah@cowan.name>
Sat, 12 Apr 2008 19:57:25 +0000 (12:57 -0700)
committerMicah Cowan <micah@cowan.name>
Sat, 12 Apr 2008 19:57:25 +0000 (12:57 -0700)
src/ChangeLog
src/utils.c

index 7201511a9cc10d463a8f93cb19a2296b4624a03d..a2881858a155dea184a5b37794484047714eec2d 100644 (file)
@@ -1,3 +1,8 @@
+2008-04-11  Alexander Dergachev  <cy6erbr4in@gmail.com>
+
+       * utils.c (aprintf): Now we are setting limits (1 Mb) for text
+       buffer when we use non-C99 vsnprintf.
+       
 2008-04-11  Micah Cowan  <micah@cowan.name>
 
        * ftp.c (getftp, ftp_loop_internal): Don't append to an existing
index 3fd1435ec20d59326d20078006fbfacb02aeecfb..af621402caa4d1c5d4f3d39d4e84e69ba5f30f04 100644 (file)
@@ -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,19 @@ 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, */
+              logprintf (LOG_ALWAYS, 
+                         _("%s: aprintf: text buffer is too big (%ld bytes), \
+free already allocated memory and abort.\n"),
+                         exec_name, size);  /* printout a log message */
+              abort ();             /* and abort... */
+            }
+                                       /* else, we continue to grow our buffer. */
+          size <<= 1;                  /* twice the old size */
+        }
       str = xrealloc (str, size);
     }
 #endif /* not HAVE_VASPRINTF */