]> granicus.if.org Git - curl/commitdiff
improved cleaning up in case of memory allocation failures
authorDaniel Stenberg <daniel@haxx.se>
Wed, 12 May 2004 09:02:23 +0000 (09:02 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 12 May 2004 09:02:23 +0000 (09:02 +0000)
lib/formdata.c
lib/formdata.h

index 60971ffa434d6c0e04cb816ed2b45fb338e8df9b..80941655a75ef23411b97f87a759e1d0b83a2866 100644 (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);
index af62156d647c3e9603d852b2115b7100f887328d..eb5284caa1ce5913727f7ab850e027ccb62bccfb 100644 (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;