improved cleaning up in case of memory allocation failures

This commit is contained in:
Daniel Stenberg 2004-05-12 09:02:23 +00:00
parent d301d69fbf
commit 005042e973
2 changed files with 56 additions and 14 deletions

View File

@ -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);

View File

@ -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;