]> granicus.if.org Git - curl/commitdiff
Fixed a curl memory leak reported by Song Ma with a modified version
authorDan Fandrich <dan@coneharvesters.com>
Tue, 10 Jul 2007 22:23:16 +0000 (22:23 +0000)
committerDan Fandrich <dan@coneharvesters.com>
Tue, 10 Jul 2007 22:23:16 +0000 (22:23 +0000)
of the patch he suggested.  Added his test case as test289 to verify.

src/main.c
tests/data/Makefile.am
tests/data/test289 [new file with mode: 0644]

index 17a961ee078754d37098467dfa7e5d9ce159cf96..4f47050593019bed75ce62256193b72887ccfe4b 100644 (file)
@@ -4009,7 +4009,21 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
             helpf("Can't open '%s'!\n", uploadfile);
             if(infd)
               fclose(infd);
-            return CURLE_READ_ERROR;
+
+            /* Free the list of remaining URLs and globbed upload files
+             * to force curl to exit immediately
+             */
+           if(urls) {
+             glob_cleanup(urls);
+             urls = NULL;
+           }
+           if(inglob) {
+             glob_cleanup(inglob);
+             inglob = NULL;
+           }
+
+           res = CURLE_READ_ERROR;
+           goto quit_urls;
           }
           infdfopen=TRUE;
           uploadfilesize=fileinfo.st_size;
@@ -4557,6 +4571,7 @@ show_error:
         SetComment( outs.filename, url);
 #endif
 
+quit_urls:
         if(headerfilep)
           fclose(headerfilep);
 
@@ -4571,9 +4586,11 @@ show_error:
 
       } /* loop to the next URL */
 
-      if(urls)
+      if(urls) {
         /* cleanup memory used for URL globbing patterns */
         glob_cleanup(urls);
+        urls = NULL;
+      }
 
       if(uploadfile)
         free(uploadfile);
index f18df11b540571af256336023f6d7452a266acd0..4af0491ca6a5ea6890305488846de90c9460ceb2 100644 (file)
@@ -42,4 +42,4 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46           \
  test405 test604 test605 test606 test607 test608 test609 test294 test295   \
  test296 test297 test298 test610 test611 test612 test406 test407 test408   \
  test409 test613 test614 test700 test701 test702 test704 test705 test703   \
- test706 test707 test350 test351 test352 test353
+ test706 test707 test350 test351 test352 test353 test289
diff --git a/tests/data/test289 b/tests/data/test289
new file mode 100644 (file)
index 0000000..63184e7
--- /dev/null
@@ -0,0 +1,30 @@
+<testcase>
+<info>
+<keywords>
+FTP
+STOR
+Resume
+FAILURE
+</keywords>
+</info>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+ <name>
+FTP resume upload but denied access to remote file
+ </name>
+ <command>
+ftp://%HOSTIP:%FTPPORT/289 -T log/illegal-nonexistent-file -C -
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+26
+</errorcode>
+</verify>
+</testcase>