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:
Daniel Stenberg 2004-12-16 22:20:33 +00:00
parent f71725de6e
commit 6e1e9caa32
1 changed files with 19 additions and 7 deletions

View File

@ -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;