diff options
author | Daniel Stenberg <daniel@haxx.se> | 2000-11-21 19:04:25 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2000-11-21 19:04:25 +0000 |
commit | 29d21bea18281c4588dcc2507e9659b3f13c3ec6 (patch) | |
tree | 8fb4201a878d302c5b683d2712e52fcaab9d054b | |
parent | b734bc37eb683451fb68a04466c3da8a54597fdf (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.c | 19 |
1 files changed, 12 insertions, 7 deletions
@@ -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; } |