aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Fandrich <dan@coneharvesters.com>2009-08-09 23:15:20 +0000
committerDan Fandrich <dan@coneharvesters.com>2009-08-09 23:15:20 +0000
commit66f5baa16e83c0e629d19e47da21de15aa65b77d (patch)
tree3357cb24dd72d7509d4dc010590118ff3850affa
parent1cb921b7f38daebf1d21c8525735e6be58552607 (diff)
Fixed some memory leaks in the command-line tool that caused most of the
torture tests to fail.
-rw-r--r--CHANGES4
-rw-r--r--src/main.c51
2 files changed, 47 insertions, 8 deletions
diff --git a/CHANGES b/CHANGES
index 2f0b74015..e5fec2df0 100644
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,10 @@
Changelog
+Daniel Fandrich (9 Aug 2009)
+- Fixed some memory leaks in the command-line tool that caused most of the
+ torture tests to fail.
+
Daniel Stenberg (2 Aug 2009)
- Curt Bogmine reported a problem with SNI enabled on a particular server. We
should introduce an option to disable SNI, but as we're in feature freeze
diff --git a/src/main.c b/src/main.c
index c9ccdf292..2dc1a6686 100644
--- a/src/main.c
+++ b/src/main.c
@@ -4378,8 +4378,11 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
file output call */
if(config->create_dirs &&
- (-1 == create_dir_hierarchy(outfile, config->errors)))
- return CURLE_WRITE_ERROR;
+ (-1 == create_dir_hierarchy(outfile, config->errors))) {
+ free(url);
+ res = CURLE_WRITE_ERROR;
+ break;
+ }
if(config->resume_from_current) {
/* We're told to continue from where we are now. Get the
@@ -4404,7 +4407,9 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
outs.stream=(FILE *) fopen(outfile, config->resume_from?"ab":"wb");
if (!outs.stream) {
helpf(config->errors, "Can't open '%s'!\n", outfile);
- return CURLE_WRITE_ERROR;
+ free(url);
+ res = CURLE_WRITE_ERROR;
+ break;
}
}
else {
@@ -4449,13 +4454,15 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
char *urlbuffer = malloc(strlen(url) + strlen(filep) + 3);
if(!urlbuffer) {
helpf(config->errors, "out of memory\n");
- return CURLE_OUT_OF_MEMORY;
+ free(url);
+ res = CURLE_OUT_OF_MEMORY;
+ break;
}
if(ptr)
/* there is a trailing slash on the URL */
sprintf(urlbuffer, "%s%s", url, filep);
else
- /* thers is no trailing slash on the URL */
+ /* there is no trailing slash on the URL */
sprintf(urlbuffer, "%s/%s", url, filep);
curl_free(filep);
@@ -4552,7 +4559,21 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
urlbuffer = malloc(strlen(url) + strlen(httpgetfields) + 3);
if(!urlbuffer) {
helpf(config->errors, "out of memory\n");
- return CURLE_OUT_OF_MEMORY;
+
+ /* 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_OUT_OF_MEMORY;
+ goto quit_urls;
}
if (pc)
sprintf(urlbuffer, "%s%c%s", url, sep, httpgetfields);
@@ -4704,8 +4725,22 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
my_setopt_str(curl, CURLOPT_SSH_KNOWNHOSTS, file);
curl_free(file);
}
- else
- return CURLE_OUT_OF_MEMORY;
+ else {
+ /* 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_OUT_OF_MEMORY;
+ goto quit_urls;
+ }
}
if(config->no_body || config->remote_time) {