diff options
author | Daniel Stenberg <daniel@haxx.se> | 2003-08-05 13:04:10 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2003-08-05 13:04:10 +0000 |
commit | 1e7e53c87e2eb635fda9b50f8642f5d2b42a35df (patch) | |
tree | 882b1e87c04805456b1f1ffcb3b64f2551859324 /lib | |
parent | b9fdf3cc3b74d4b08533e9c781ff7bbce6c9bc15 (diff) |
clean up the dir tree hierarchy in *_done() to make persistant connection
FTP use the correct directories!
Reported in bug report #783116
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ftp.c | 51 |
1 files changed, 28 insertions, 23 deletions
@@ -105,6 +105,15 @@ static CURLcode ftp_cwd(struct connectdata *conn, char *path); /* easy-to-use macro: */ #define FTPSENDF(x,y,z) if((result = Curl_ftpsendf(x,y,z))) return result +static void freedirs(struct FTP *ftp) +{ + int i; + for (i=0; ftp->dirs[i]; i++){ + free(ftp->dirs[i]); + ftp->dirs[i]=NULL; + } +} + /*********************************************************************** * * AllowServerConnect() @@ -598,6 +607,14 @@ CURLcode Curl_ftp_done(struct connectdata *conn) int ftpcode; CURLcode result=CURLE_OK; + /* free the dir tree parts */ + freedirs(ftp); + + if(ftp->file) { + free(ftp->file); + ftp->file = NULL; + } + if(data->set.upload) { if((-1 != data->set.infilesize) && (data->set.infilesize != *ftp->bytecountp) && @@ -2161,7 +2178,8 @@ CURLcode Curl_ftp(struct connectdata *conn) if (!ftp->dirs[path_part]) { /* run out of memory ... */ failf(data, "no memory"); - retcode = CURLE_OUT_OF_MEMORY; + freedirs(ftp); + return CURLE_OUT_OF_MEMORY; } } else { @@ -2175,17 +2193,10 @@ CURLcode Curl_ftp(struct connectdata *conn) /* too deep, we need the last entry to be kept NULL at all times to signal end of list */ failf(data, "too deep dir hierarchy"); - retcode = CURLE_URL_MALFORMAT; + freedirs(ftp); + return CURLE_URL_MALFORMAT; } } - if (retcode) { - int i; - for (i=0;i<path_part;i++) { /* free previous parts */ - free(ftp->dirs[i]); - ftp->dirs[i]=NULL; - } - return retcode; /* failure */ - } } ftp->file = cur_pos; /* the rest is the file name */ @@ -2193,11 +2204,7 @@ CURLcode Curl_ftp(struct connectdata *conn) if(*ftp->file) { ftp->file = curl_unescape(ftp->file, 0); if(NULL == ftp->file) { - int i; - for (i=0;i<path_part;i++){ - free(ftp->dirs[i]); - ftp->dirs[i]=NULL; - } + freedirs(ftp); failf(data, "no memory"); return CURLE_OUT_OF_MEMORY; } @@ -2288,22 +2295,20 @@ CURLcode Curl_ftpsendf(struct connectdata *conn, CURLcode Curl_ftp_disconnect(struct connectdata *conn) { struct FTP *ftp= conn->proto.ftp; - int i; /* The FTP session may or may not have been allocated/setup at this point! */ if(ftp) { if(ftp->entrypath) free(ftp->entrypath); - if(ftp->cache) + if(ftp->cache) { free(ftp->cache); - if(ftp->file) + ftp->cache = NULL; + } + if(ftp->file) { free(ftp->file); - for (i=0;ftp->dirs[i];i++){ - free(ftp->dirs[i]); - ftp->dirs[i]=NULL; + ftp->file = NULL; /* zero */ } - - ftp->file = NULL; /* zero */ + freedirs(ftp); } return CURLE_OK; } |