aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2000-11-21 19:04:25 +0000
committerDaniel Stenberg <daniel@haxx.se>2000-11-21 19:04:25 +0000
commit29d21bea18281c4588dcc2507e9659b3f13c3ec6 (patch)
tree8fb4201a878d302c5b683d2712e52fcaab9d054b
parentb734bc37eb683451fb68a04466c3da8a54597fdf (diff)
bad directory name extractor fixed, now always free the file and directory
very early, as that could leak memory before
-rw-r--r--lib/ftp.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/lib/ftp.c b/lib/ftp.c
index 13262970c..425b60cce 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -129,7 +129,7 @@ struct curl_slist *curl_slist_append(struct curl_slist *list, char *data)
}
else {
fprintf(stderr, "Cannot allocate memory for QUOTE list.\n");
- exit(-1);
+ return NULL;
}
if (list) {
@@ -584,11 +584,6 @@ CURLcode ftp_done(struct connectdata *conn)
}
}
- if(ftp->file)
- free(ftp->file);
- if(ftp->dir)
- free(ftp->dir);
-
free(ftp);
data->proto.ftp=NULL; /* it is gone */
@@ -1406,13 +1401,15 @@ CURLcode ftp(struct connectdata *conn)
it */
ftp->file = strrchr(conn->ppath, '/');
if(ftp->file) {
+ if(ftp->file != conn->ppath)
+ dirlength=ftp->file-conn->ppath; /* don't count the traling slash */
+
ftp->file++; /* point to the first letter in the file name part or
remain NULL */
}
else {
ftp->file = conn->ppath; /* there's only a file part */
}
- dirlength=ftp->file-conn->ppath;
if(*ftp->file) {
ftp->file = curl_unescape(ftp->file, 0);
@@ -1440,6 +1437,14 @@ CURLcode ftp(struct connectdata *conn)
retcode = _ftp(conn);
+ /* clean up here, success or error doesn't matter */
+ if(ftp->file)
+ free(ftp->file);
+ if(ftp->dir)
+ free(ftp->dir);
+
+ ftp->file = ftp->dir = NULL; /* zero */
+
return retcode;
}