Curl_ftp_disconnect() no longer relies on anything in the reqdata struct. That

was even mentioned to be bad in a comment! Should make test 2000 and 2001 work
fine.

Also, freedirs() now take a ftp_conn struct pointer which saves some extra
unnecessary variable assignments.
This commit is contained in:
Daniel Stenberg 2007-10-24 21:14:11 +00:00
parent a3f958aaaa
commit 8997d258f7
1 changed files with 27 additions and 32 deletions

View File

@ -259,10 +259,8 @@ const struct Curl_handler Curl_handler_ftps_proxy = {
*/
#define CURL_FTP_HTTPSTYLE_HEAD 1
static void freedirs(struct connectdata *conn)
static void freedirs(struct ftp_conn *ftpc)
{
struct ftp_conn *ftpc = &conn->proto.ftpc;
int i;
if(ftpc->dirs) {
for (i=0; i < ftpc->dirdepth; i++){
@ -3209,7 +3207,7 @@ static CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status,
}
}
/* free the dir tree and file parts */
freedirs(conn);
freedirs(ftpc);
#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI)
Curl_sec_fflush_fd(conn, conn->sock[SECONDARYSOCKET]);
@ -3806,29 +3804,26 @@ static CURLcode Curl_ftp_disconnect(struct connectdata *conn)
*/
/* The FTP session may or may not have been allocated/setup at this point! */
/* FIXME: checking for conn->data->reqdata.proto.ftp is not correct here,
* the reqdata structure could be used by another connection already */
if(conn->data->reqdata.proto.ftp) {
(void)ftp_quit(conn); /* ignore errors on the QUIT */
(void)ftp_quit(conn); /* ignore errors on the QUIT */
if(ftpc->entrypath) {
struct SessionHandle *data = conn->data;
if (data->state.most_recent_ftp_entrypath == ftpc->entrypath) {
data->state.most_recent_ftp_entrypath = NULL;
}
free(ftpc->entrypath);
ftpc->entrypath = NULL;
}
if(ftpc->cache) {
free(ftpc->cache);
ftpc->cache = NULL;
}
freedirs(conn);
if(ftpc->prevpath) {
free(ftpc->prevpath);
ftpc->prevpath = NULL;
if(ftpc->entrypath) {
struct SessionHandle *data = conn->data;
if (data->state.most_recent_ftp_entrypath == ftpc->entrypath) {
data->state.most_recent_ftp_entrypath = NULL;
}
free(ftpc->entrypath);
ftpc->entrypath = NULL;
}
if(ftpc->cache) {
free(ftpc->cache);
ftpc->cache = NULL;
}
freedirs(ftpc);
if(ftpc->prevpath) {
free(ftpc->prevpath);
ftpc->prevpath = NULL;
}
return CURLE_OK;
}
@ -3900,7 +3895,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
slash_pos?(int)(slash_pos-cur_pos):1,
NULL);
if(!ftpc->dirs[0]) {
freedirs(conn);
freedirs(ftpc);
return CURLE_OUT_OF_MEMORY;
}
ftpc->dirdepth = 1; /* we consider it to be a single dir */
@ -3941,12 +3936,12 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
curl_easy_unescape(conn->data, cur_pos - absolute_dir, len, NULL);
if (!ftpc->dirs[ftpc->dirdepth]) { /* run out of memory ... */
failf(data, "no memory");
freedirs(conn);
freedirs(ftpc);
return CURLE_OUT_OF_MEMORY;
}
if (isBadFtpString(ftpc->dirs[ftpc->dirdepth])) {
free(ftpc->dirs[ftpc->dirdepth]);
freedirs(conn);
freedirs(ftpc);
return CURLE_URL_MALFORMAT;
}
}
@ -3962,7 +3957,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
ftpc->diralloc *= 2; /* double the size each time */
bigger = realloc(ftpc->dirs, ftpc->diralloc * sizeof(ftpc->dirs[0]));
if(!bigger) {
freedirs(conn);
freedirs(ftpc);
return CURLE_OUT_OF_MEMORY;
}
ftpc->dirs = (char **)bigger;
@ -3975,12 +3970,12 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
if(ftpc->file && *ftpc->file) {
ftpc->file = curl_easy_unescape(conn->data, ftpc->file, 0, NULL);
if(NULL == ftpc->file) {
freedirs(conn);
freedirs(ftpc);
failf(data, "no memory");
return CURLE_OUT_OF_MEMORY;
}
if (isBadFtpString(ftpc->file)) {
freedirs(conn);
freedirs(ftpc);
return CURLE_URL_MALFORMAT;
}
}
@ -4001,7 +3996,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
strings */
char *path = curl_easy_unescape(conn->data, data->reqdata.path, 0, NULL);
if(!path) {
freedirs(conn);
freedirs(ftpc);
return CURLE_OUT_OF_MEMORY;
}
@ -4106,7 +4101,7 @@ CURLcode ftp_regular_transfer(struct connectdata *conn,
return result;
}
else
freedirs(conn);
freedirs(ftpc);
return result;
}