Based on Gisle Vanem's patch: make sure the directory re-use works even when
a URL-encoded path is used.
This commit is contained in:
parent
f71725de6e
commit
6e1e9caa32
26
lib/ftp.c
26
lib/ftp.c
@ -765,23 +765,29 @@ CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status)
|
|||||||
bool was_ctl_valid = ftp->ctl_valid;
|
bool was_ctl_valid = ftp->ctl_valid;
|
||||||
size_t flen;
|
size_t flen;
|
||||||
size_t dlen;
|
size_t dlen;
|
||||||
|
char *path;
|
||||||
|
|
||||||
/* now store a copy of the directory we are in */
|
/* now store a copy of the directory we are in */
|
||||||
if(ftp->prevpath)
|
if(ftp->prevpath)
|
||||||
free(ftp->prevpath);
|
free(ftp->prevpath);
|
||||||
|
|
||||||
flen = ftp->file?strlen(ftp->file):0;
|
path = curl_unescape(conn->path, 0); /* get the "raw" path */
|
||||||
dlen = conn->path?strlen(conn->path)-flen:0;
|
if(!path)
|
||||||
|
CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
flen = ftp->file?strlen(ftp->file):0; /* file is "raw" already */
|
||||||
|
dlen = strlen(path)-flen;
|
||||||
if(dlen) {
|
if(dlen) {
|
||||||
ftp->prevpath = malloc(dlen + 1);
|
ftp->prevpath = malloc(dlen + 1);
|
||||||
if(!ftp->prevpath)
|
if(!ftp->prevpath)
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
memcpy(ftp->prevpath, conn->path, dlen);
|
memcpy(ftp->prevpath, path, dlen);
|
||||||
ftp->prevpath[dlen]=0; /* terminate */
|
ftp->prevpath[dlen]=0; /* terminate */
|
||||||
infof(data, "Remembering we are in dir %s\n", ftp->prevpath);
|
infof(data, "Remembering we are in dir %s\n", ftp->prevpath);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ftp->prevpath = NULL; /* no path */
|
ftp->prevpath = NULL; /* no path */
|
||||||
|
free(path);
|
||||||
|
|
||||||
/* free the dir tree and file parts */
|
/* free the dir tree and file parts */
|
||||||
freedirs(ftp);
|
freedirs(ftp);
|
||||||
@ -2771,14 +2777,20 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
|
|||||||
|
|
||||||
ftp->cwddone = FALSE; /* default to not done */
|
ftp->cwddone = FALSE; /* default to not done */
|
||||||
|
|
||||||
dlen = conn->path?strlen(conn->path):0;
|
if(ftp->prevpath) {
|
||||||
if(dlen && ftp->prevpath) {
|
/* prevpath is "raw" so we convert the input path before we compare the
|
||||||
dlen -= ftp->file?strlen(ftp->file):0;
|
strings */
|
||||||
|
char *path = curl_unescape(conn->path, 0);
|
||||||
|
if(!path)
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
dlen = strlen(path) - (ftp->file?strlen(ftp->file):0);
|
||||||
if((dlen == strlen(ftp->prevpath)) &&
|
if((dlen == strlen(ftp->prevpath)) &&
|
||||||
curl_strnequal(conn->path, ftp->prevpath, dlen)) {
|
curl_strnequal(path, ftp->prevpath, dlen)) {
|
||||||
infof(data, "Request has same path as previous transfer\n");
|
infof(data, "Request has same path as previous transfer\n");
|
||||||
ftp->cwddone = TRUE;
|
ftp->cwddone = TRUE;
|
||||||
}
|
}
|
||||||
|
free(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
return retcode;
|
return retcode;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user