From 1e7e53c87e2eb635fda9b50f8642f5d2b42a35df Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 5 Aug 2003 13:04:10 +0000 Subject: [PATCH] clean up the dir tree hierarchy in *_done() to make persistant connection FTP use the correct directories! Reported in bug report #783116 --- lib/ftp.c | 53 +++++++++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/lib/ftp.c b/lib/ftp.c index bfe6e7a466..6acab245b0 100644 --- a/lib/ftp.c +++ b/lib/ftp.c @@ -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;idirs[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;idirs[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) - free(ftp->file); - for (i=0;ftp->dirs[i];i++){ - free(ftp->dirs[i]); - ftp->dirs[i]=NULL; + ftp->cache = NULL; } - - ftp->file = NULL; /* zero */ + if(ftp->file) { + free(ftp->file); + ftp->file = NULL; /* zero */ + } + freedirs(ftp); } return CURLE_OK; }