summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDan Fandrich <dan@coneharvesters.com>2007-04-12 01:26:02 +0000
committerDan Fandrich <dan@coneharvesters.com>2007-04-12 01:26:02 +0000
commit70cce4cddd78eb09c312d97d9aae82f762f4c93a (patch)
treefff4502cc36657281e63fa9e2cc5786fcca82dc8 /lib
parent42c0ac200880a785222a8b3f403e3e6238c16707 (diff)
downloadcurl-70cce4cddd78eb09c312d97d9aae82f762f4c93a.tar.gz
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.
Diffstat (limited to 'lib')
-rw-r--r--lib/ftp.c34
1 files changed, 18 insertions, 16 deletions
diff --git a/lib/ftp.c b/lib/ftp.c
index a30b6ac08..ecbfd12f0 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -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);