mirror of
https://github.com/moparisthebest/curl
synced 2024-12-22 08:08:50 -05:00
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:
parent
a3f958aaaa
commit
8997d258f7
59
lib/ftp.c
59
lib/ftp.c
@ -259,10 +259,8 @@ const struct Curl_handler Curl_handler_ftps_proxy = {
|
|||||||
*/
|
*/
|
||||||
#define CURL_FTP_HTTPSTYLE_HEAD 1
|
#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;
|
int i;
|
||||||
if(ftpc->dirs) {
|
if(ftpc->dirs) {
|
||||||
for (i=0; i < ftpc->dirdepth; i++){
|
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 */
|
/* free the dir tree and file parts */
|
||||||
freedirs(conn);
|
freedirs(ftpc);
|
||||||
|
|
||||||
#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI)
|
#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI)
|
||||||
Curl_sec_fflush_fd(conn, conn->sock[SECONDARYSOCKET]);
|
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! */
|
/* 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,
|
(void)ftp_quit(conn); /* ignore errors on the QUIT */
|
||||||
* 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 */
|
|
||||||
|
|
||||||
if(ftpc->entrypath) {
|
if(ftpc->entrypath) {
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
if (data->state.most_recent_ftp_entrypath == ftpc->entrypath) {
|
if (data->state.most_recent_ftp_entrypath == ftpc->entrypath) {
|
||||||
data->state.most_recent_ftp_entrypath = NULL;
|
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;
|
|
||||||
}
|
}
|
||||||
|
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;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3900,7 +3895,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
|
|||||||
slash_pos?(int)(slash_pos-cur_pos):1,
|
slash_pos?(int)(slash_pos-cur_pos):1,
|
||||||
NULL);
|
NULL);
|
||||||
if(!ftpc->dirs[0]) {
|
if(!ftpc->dirs[0]) {
|
||||||
freedirs(conn);
|
freedirs(ftpc);
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
ftpc->dirdepth = 1; /* we consider it to be a single dir */
|
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);
|
curl_easy_unescape(conn->data, cur_pos - absolute_dir, len, NULL);
|
||||||
if (!ftpc->dirs[ftpc->dirdepth]) { /* run out of memory ... */
|
if (!ftpc->dirs[ftpc->dirdepth]) { /* run out of memory ... */
|
||||||
failf(data, "no memory");
|
failf(data, "no memory");
|
||||||
freedirs(conn);
|
freedirs(ftpc);
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
if (isBadFtpString(ftpc->dirs[ftpc->dirdepth])) {
|
if (isBadFtpString(ftpc->dirs[ftpc->dirdepth])) {
|
||||||
free(ftpc->dirs[ftpc->dirdepth]);
|
free(ftpc->dirs[ftpc->dirdepth]);
|
||||||
freedirs(conn);
|
freedirs(ftpc);
|
||||||
return CURLE_URL_MALFORMAT;
|
return CURLE_URL_MALFORMAT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3962,7 +3957,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
|
|||||||
ftpc->diralloc *= 2; /* double the size each time */
|
ftpc->diralloc *= 2; /* double the size each time */
|
||||||
bigger = realloc(ftpc->dirs, ftpc->diralloc * sizeof(ftpc->dirs[0]));
|
bigger = realloc(ftpc->dirs, ftpc->diralloc * sizeof(ftpc->dirs[0]));
|
||||||
if(!bigger) {
|
if(!bigger) {
|
||||||
freedirs(conn);
|
freedirs(ftpc);
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
ftpc->dirs = (char **)bigger;
|
ftpc->dirs = (char **)bigger;
|
||||||
@ -3975,12 +3970,12 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
|
|||||||
if(ftpc->file && *ftpc->file) {
|
if(ftpc->file && *ftpc->file) {
|
||||||
ftpc->file = curl_easy_unescape(conn->data, ftpc->file, 0, NULL);
|
ftpc->file = curl_easy_unescape(conn->data, ftpc->file, 0, NULL);
|
||||||
if(NULL == ftpc->file) {
|
if(NULL == ftpc->file) {
|
||||||
freedirs(conn);
|
freedirs(ftpc);
|
||||||
failf(data, "no memory");
|
failf(data, "no memory");
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
if (isBadFtpString(ftpc->file)) {
|
if (isBadFtpString(ftpc->file)) {
|
||||||
freedirs(conn);
|
freedirs(ftpc);
|
||||||
return CURLE_URL_MALFORMAT;
|
return CURLE_URL_MALFORMAT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4001,7 +3996,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
|
|||||||
strings */
|
strings */
|
||||||
char *path = curl_easy_unescape(conn->data, data->reqdata.path, 0, NULL);
|
char *path = curl_easy_unescape(conn->data, data->reqdata.path, 0, NULL);
|
||||||
if(!path) {
|
if(!path) {
|
||||||
freedirs(conn);
|
freedirs(ftpc);
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4106,7 +4101,7 @@ CURLcode ftp_regular_transfer(struct connectdata *conn,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
freedirs(conn);
|
freedirs(ftpc);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user