From a2ecdf42497682072b61eed4e8a6002b2e54da1b Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 10 May 2004 10:50:43 +0000 Subject: the aprintf() versions now return NULL if _any_ alloc along the way failed, previously they could return a piece of the string, making it impossible for the caller to detect errors. --- lib/mprintf.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/mprintf.c b/lib/mprintf.c index e8613839f..a9c375778 100644 --- a/lib/mprintf.c +++ b/lib/mprintf.c @@ -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; -- cgit v1.2.3