diff options
author | Daniel Stenberg <daniel@haxx.se> | 2004-05-10 10:50:43 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2004-05-10 10:50:43 +0000 |
commit | a2ecdf42497682072b61eed4e8a6002b2e54da1b (patch) | |
tree | e28639b523f57535e0c39d03e70cbacee13f39aa /lib | |
parent | 71fdc063bd170d53f442e8b0e777756a38e2fa75 (diff) |
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.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/mprintf.c | 13 |
1 files changed, 10 insertions, 3 deletions
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; |