From 8c51744d30897b998728f531517ff9198be3b589 Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Mon, 13 Jun 2011 11:21:11 +0200
Subject: [PATCH] curl_formget: better cleanup

To avoid leaking a FILE * or other data, check file pointer always and
use breaks and return value variable and only leave function at the
bottom.
---
 lib/formdata.c |   18 ++++++++++--------
 1 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/lib/formdata.c b/lib/formdata.c
index df4094c..9646c7e 100644
--- a/lib/formdata.c
+++ b/lib/formdata.c
@@ -869,6 +869,7 @@ int curl_formget(struct curl_httppost *form, void *arg,
   CURLcode rc;
   curl_off_t size;
   struct FormData *data, *ptr;
+  int retcode = 0;
 
   rc = Curl_getformdata(NULL, &data, form, NULL, &size);
   if(rc != CURLE_OK)
@@ -885,23 +886,24 @@ int curl_formget(struct curl_httppost *form, void *arg,
       do {
         nread = readfromfile(&temp, buffer, sizeof(buffer));
         if((nread == (size_t) -1) || (nread != append(arg, buffer, nread))) {
-          if(temp.fp) {
-            fclose(temp.fp);
-          }
-          Curl_formclean(&data);
-          return -1;
+          retcode = -1;
+          break;
         }
       } while(nread == sizeof(buffer));
+      if(temp.fp)
+        fclose(temp.fp);
+      if(retcode)
+        break;
     }
     else {
       if(ptr->length != append(arg, ptr->line, ptr->length)) {
-        Curl_formclean(&data);
-        return -1;
+        retcode = -1;
+        break;
       }
     }
   }
   Curl_formclean(&data);
-  return 0;
+  return retcode;
 }
 
 /*
-- 
1.7.5.3

