aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2004-05-12 09:02:23 +0000
committerDaniel Stenberg <daniel@haxx.se>2004-05-12 09:02:23 +0000
commit005042e973cb6e42b8bf76ae15a72f1482c43e6b (patch)
tree96f624013caea58c8e0b6ae41a211dbdd6b44b37
parentd301d69fbf0342b9510751dcf478487b2e710684 (diff)
improved cleaning up in case of memory allocation failures
-rw-r--r--lib/formdata.c68
-rw-r--r--lib/formdata.h2
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;