aboutsummaryrefslogtreecommitdiff
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
parent42c0ac200880a785222a8b3f403e3e6238c16707 (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.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);