diff options
| -rw-r--r-- | lib/formdata.c | 68 | ||||
| -rw-r--r-- | 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; | 
