diff options
author | Dan Fandrich <dan@coneharvesters.com> | 2007-04-12 01:26:02 +0000 |
---|---|---|
committer | Dan Fandrich <dan@coneharvesters.com> | 2007-04-12 01:26:02 +0000 |
commit | 70cce4cddd78eb09c312d97d9aae82f762f4c93a (patch) | |
tree | fff4502cc36657281e63fa9e2cc5786fcca82dc8 | |
parent | 42c0ac200880a785222a8b3f403e3e6238c16707 (diff) |
Work around an out of memory situation in Curl_ftp_done instead of
returning an error code, to allow connections to be torn down
cleanly since this function can be called AFTER an OOM situation
has already been reached.
-rw-r--r-- | lib/ftp.c | 34 |
1 files changed, 18 insertions, 16 deletions
@@ -2996,8 +2996,6 @@ CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status, bool premature int ftpcode; CURLcode result=CURLE_OK; bool was_ctl_valid = ftpc->ctl_valid; - size_t flen; - size_t dlen; char *path; char *path_to_use = data->reqdata.path; struct Curl_transfer_keeper *k = &data->reqdata.keep; @@ -3043,21 +3041,25 @@ CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status, bool premature /* get the "raw" path */ path = curl_easy_unescape(data, path_to_use, 0, NULL); - if(!path) - return CURLE_OUT_OF_MEMORY; - - flen = ftp->file?strlen(ftp->file):0; /* file is "raw" already */ - dlen = strlen(path)-flen; - if(dlen && !ftpc->cwdfail) { - ftpc->prevpath = path; - if(flen) - /* if 'path' is not the whole string */ - ftpc->prevpath[dlen]=0; /* terminate */ - infof(data, "Remembering we are in dir %s\n", ftpc->prevpath); - } - else { + if(!path) { + /* out of memory, but we can limp along anyway (and should try to + * since we're in the out of memory cleanup path) */ ftpc->prevpath = NULL; /* no path */ - free(path); + + } else { + size_t flen = ftp->file?strlen(ftp->file):0; /* file is "raw" already */ + size_t dlen = strlen(path)-flen; + if(dlen && !ftpc->cwdfail) { + ftpc->prevpath = path; + if(flen) + /* if 'path' is not the whole string */ + ftpc->prevpath[dlen]=0; /* terminate */ + infof(data, "Remembering we are in dir %s\n", ftpc->prevpath); + } + else { + ftpc->prevpath = NULL; /* no path */ + free(path); + } } /* free the dir tree and file parts */ freedirs(conn); |