aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2003-08-06 23:48:08 +0000
committerDaniel Stenberg <daniel@haxx.se>2003-08-06 23:48:08 +0000
commit0d8c754ffd2acacbe6a995f9070ca94b5a846107 (patch)
tree37ae6560f1b22942d2a36c6fb44a2d2f5bdeb726 /src
parent1b802764960ac99e84657342f32557094e129324 (diff)
better cleaning up of memory in case of failures in the get-loop (it was
taken care of by the exit-free anyway but caused test case 75 and 76 to report memory leaks). Also re-indented a small section.
Diffstat (limited to 'src')
-rw-r--r--src/main.c50
1 files changed, 30 insertions, 20 deletions
diff --git a/src/main.c b/src/main.c
index ea103e7ae..a61181804 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2631,13 +2631,15 @@ operate(struct Configurable *config, int argc, char *argv[])
/*
* Get a curl handle to use for all forthcoming curl transfers. Cleanup
- * when all transfers are done. This is supported with libcurl 7.7 and
- * should not be attempted on previous versions.
+ * when all transfers are done.
*/
curl = curl_easy_init();
if(!curl)
return CURLE_FAILED_INIT;
+ /* After this point, we should call curl_easy_cleanup() if we decide to bail
+ * out from this function! */
+
urlnode = config->url_list;
if(config->headerfile) {
@@ -2680,8 +2682,10 @@ operate(struct Configurable *config, int argc, char *argv[])
res = glob_url(&urls, url, &urlnum,
config->showerror?
(config->errors?config->errors:stderr):NULL);
- if(res != CURLE_OK)
- return res;
+ if(res != CURLE_OK) {
+ clean_getout(config);
+ break;
+ }
}
@@ -2714,10 +2718,17 @@ operate(struct Configurable *config, int argc, char *argv[])
else
pc=url;
pc = strrchr(pc, '/');
- outfile = (char *) NULL == pc ? NULL : strdup(pc+1) ;
- if(!outfile) {
+
+ if(pc) {
+ /* duplicate the string beyond the slash */
+ pc++;
+ outfile = *pc ? strdup(pc): NULL;
+ }
+ if(!outfile || !*outfile) {
helpf("Remote file name has no length!\n");
- return CURLE_WRITE_ERROR;
+ res = CURLE_WRITE_ERROR;
+ free(url);
+ break;
}
#if defined(__DJGPP__)
{
@@ -2741,8 +2752,9 @@ operate(struct Configurable *config, int argc, char *argv[])
file output call */
if(config->create_dirs)
- if (-1 == create_dir_hierarchy(outfile))
+ if (-1 == create_dir_hierarchy(outfile)) {
return CURLE_WRITE_ERROR;
+ }
if(config->resume_from_current) {
/* We're told to continue from where we are now. Get the
@@ -3230,19 +3242,17 @@ static char *my_get_line(FILE *fp)
char *nl = NULL;
char *retval = NULL;
- do
- {
- if (NULL == fgets(buf, sizeof(buf), fp))
+ do {
+ if (NULL == fgets(buf, sizeof(buf), fp))
+ break;
+ if (NULL == retval)
+ retval = strdup(buf);
+ else {
+ if (NULL == (retval = realloc(retval,
+ strlen(retval) + strlen(buf) + 1)))
break;
- if (NULL == retval)
- retval = strdup(buf);
- else
- {
- if (NULL == (retval = realloc(retval,
- strlen(retval) + strlen(buf) + 1)))
- break;
- strcat(retval, buf);
- }
+ strcat(retval, buf);
+ }
}
while (NULL == (nl = strchr(retval, '\n')));