]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
the aprintf() versions now return NULL if _any_ alloc along the way failed,
authorDaniel Stenberg <daniel@haxx.se>
Mon, 10 May 2004 10:50:43 +0000 (10:50 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 10 May 2004 10:50:43 +0000 (10:50 +0000)
previously they could return a piece of the string, making it impossible
for the caller to detect errors.

lib/mprintf.c

index e8613839fb25e21bc463c7fffabf8b4c8c9225e2..a9c3757783ba47801217d798a887fccca2cbee51 100644 (file)
@@ -153,6 +153,8 @@ struct asprintf {
   char *buffer; /* allocated buffer */
   size_t len;   /* length of string */
   size_t alloc; /* length of alloc */
+  bool fail;    /* TRUE if an alloc has failed and thus the output is not
+                   the complete data */
 };
 
 int curl_msprintf(char *buffer, const char *format, ...);
@@ -1032,8 +1034,10 @@ static int alloc_addbyter(int output, FILE *data)
  
   if(!infop->buffer) {
     infop->buffer=(char *)malloc(32);
-    if(!infop->buffer)
+    if(!infop->buffer) {
+      infop->fail = TRUE;
       return -1; /* fail */
+    }
     infop->alloc = 32;
     infop->len =0;
   }
@@ -1043,6 +1047,7 @@ static int alloc_addbyter(int output, FILE *data)
     newptr = (char *)realloc(infop->buffer, infop->alloc*2);
 
     if(!newptr) {
+      infop->fail = TRUE;
       return -1;
     }
     infop->buffer = newptr;
@@ -1065,11 +1070,12 @@ char *curl_maprintf(const char *format, ...)
   info.buffer = NULL;
   info.len = 0;
   info.alloc = 0;
+  info.fail = FALSE;
 
   va_start(ap_save, format);
   retcode = dprintf_formatf(&info, alloc_addbyter, format, ap_save);
   va_end(ap_save);
-  if(-1 == retcode) {
+  if((-1 == retcode) || info.fail) {
     if(info.alloc)
       free(info.buffer);
     return NULL;
@@ -1090,9 +1096,10 @@ char *curl_mvaprintf(const char *format, va_list ap_save)
   info.buffer = NULL;
   info.len = 0;
   info.alloc = 0;
+  info.fail = FALSE;
 
   retcode = dprintf_formatf(&info, alloc_addbyter, format, ap_save);
-  if(-1 == retcode) {
+  if((-1 == retcode) || info.fail) {
     if(info.alloc)
       free(info.buffer);
     return NULL;