From 005042e973cb6e42b8bf76ae15a72f1482c43e6b Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 12 May 2004 09:02:23 +0000 Subject: [PATCH] improved cleaning up in case of memory allocation failures --- lib/formdata.c | 68 +++++++++++++++++++++++++++++++++++++++----------- lib/formdata.h | 2 ++ 2 files changed, 56 insertions(+), 14 deletions(-) diff --git a/lib/formdata.c b/lib/formdata.c index 60971ffa4..80941655a 100644 --- a/lib/formdata.c +++ b/lib/formdata.c @@ -370,7 +370,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost, struct curl_httppost **last_post, va_list params) { - FormInfo *first_form, *current_form, *form; + FormInfo *first_form, *current_form, *form = NULL; CURLFORMcode return_value = CURL_FORMADD_OK; const char *prevtype = NULL; struct curl_httppost *post = NULL; @@ -490,7 +490,10 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost, array_value:va_arg(params, char *); if (filename) { current_form->value = strdup(filename); - current_form->flags |= HTTPPOST_READFILE; + if(!current_form->value) + return_value = CURL_FORMADD_MEMORY; + else + current_form->flags |= HTTPPOST_READFILE; } else return_value = CURL_FORMADD_NULL; @@ -517,11 +520,17 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost, return_value = CURL_FORMADD_OPTION_TWICE; } else { - if (filename) + if (filename) { current_form->value = strdup(filename); + if(!current_form->value) + return_value = CURL_FORMADD_MEMORY; + else { + current_form->flags |= HTTPPOST_FILENAME; + current_form->value_alloc = TRUE; + } + } else return_value = CURL_FORMADD_NULL; - current_form->flags |= HTTPPOST_FILENAME; } break; } @@ -545,8 +554,11 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost, return_value = CURL_FORMADD_OPTION_TWICE; } else { - if (filename) + if (filename) { current_form->value = strdup(filename); + if(!current_form->value) + return_value = CURL_FORMADD_MEMORY; + } else return_value = CURL_FORMADD_NULL; current_form->flags |= HTTPPOST_BUFFER; @@ -595,8 +607,13 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost, return_value = CURL_FORMADD_OPTION_TWICE; } else { - if (contenttype) + if (contenttype) { current_form->contenttype = strdup(contenttype); + if(!current_form->contenttype) + return_value = CURL_FORMADD_MEMORY; + else + current_form->contenttype_alloc = TRUE; + } else return_value = CURL_FORMADD_NULL; } @@ -623,8 +640,13 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost, va_arg(params, char *); if( current_form->showfilename ) return_value = CURL_FORMADD_OPTION_TWICE; - else + else { current_form->showfilename = strdup(filename); + if(!current_form->showfilename) + return_value = CURL_FORMADD_MEMORY; + else + current_form->showfilename_alloc = TRUE; + } break; } default: @@ -663,6 +685,11 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost, /* our contenttype is missing */ form->contenttype = strdup(ContentTypeForFilename(form->value, prevtype)); + if(!form->contenttype) { + return_value = CURL_FORMADD_MEMORY; + break; + } + form->contenttype_alloc = TRUE; } if ( !(form->flags & HTTPPOST_PTRNAME) && (form == first_form) ) { @@ -705,12 +732,20 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost, } } - if(return_value && form) { + if(return_value) { /* we return on error, free possibly allocated fields */ - if(form->name_alloc) - free(form->name); - if(form->value_alloc) - free(form->value); + if(!form) + form = current_form; + if(form) { + if(form->name_alloc) + free(form->name); + if(form->value_alloc) + free(form->value); + if(form->contenttype_alloc) + free(form->contenttype); + if(form->showfilename_alloc) + free(form->showfilename); + } } /* always delete the allocated memory before returning */ @@ -840,6 +875,9 @@ void Curl_formclean(struct FormData *form) { struct FormData *next; + if(!form) + return; + do { next=form->next; /* the following form line */ free(form->line); /* free the line */ @@ -907,6 +945,8 @@ CURLcode Curl_getFormData(struct FormData **finalform, return result; /* no input => no output! */ boundary = Curl_FormBoundary(); + if(!boundary) + return CURLE_OUT_OF_MEMORY; /* Make the first line of the output */ result = AddFormDataf(&form, NULL, @@ -1054,14 +1094,14 @@ CURLcode Curl_getFormData(struct FormData **finalform, if (result) break; } + if(fileread != stdin) + fclose(fileread); if (result) { Curl_formclean(firstform); free(boundary); return result; } - if(fileread != stdin) - fclose(fileread); } else { Curl_formclean(firstform); diff --git a/lib/formdata.h b/lib/formdata.h index af62156d6..eb5284caa 100644 --- a/lib/formdata.h +++ b/lib/formdata.h @@ -45,11 +45,13 @@ typedef struct FormInfo { bool value_alloc; size_t contentslength; char *contenttype; + bool contenttype_alloc; long flags; char *buffer; /* pointer to existing buffer used for file upload */ size_t bufferlength; char *showfilename; /* The file name to show. If not set, the actual file name will be used */ + bool showfilename_alloc; struct curl_slist* contentheader; struct FormInfo *more; } FormInfo;