From: Daniel Stenberg Date: Sat, 14 May 2016 22:37:36 +0000 (+0200) Subject: ftp wildcard: segfault due to init only in multi_perform X-Git-Tag: curl-7_49_0~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cba962134256e8b17c70dbb543ffcf935d2a53e4;p=thirdparty%2Fcurl.git ftp wildcard: segfault due to init only in multi_perform The proper FTP wildcard init is now more properly done in Curl_pretransfer() and the corresponding cleanup in Curl_close(). The previous place of init/cleanup code made the internal pointer to be NULL when this feature was used with the multi_socket() API, as it was made within the curl_multi_perform() function. Reported-by: Jonathan Cardoso Machado Fixes #800 --- diff --git a/lib/multi.c b/lib/multi.c index ffc422c40a..7e2725bab6 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -2116,27 +2116,12 @@ CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles) data=multi->easyp; while(data) { CURLMcode result; - struct WildcardData *wc = &data->wildcard; SIGPIPE_VARIABLE(pipe_st); - if(data->set.wildcardmatch) { - if(!wc->filelist) { - CURLcode ret = Curl_wildcard_init(wc); /* init wildcard structures */ - if(ret) - return CURLM_OUT_OF_MEMORY; - } - } - sigpipe_ignore(data, &pipe_st); result = multi_runsingle(multi, now, data); sigpipe_restore(&pipe_st); - if(data->set.wildcardmatch) { - /* destruct wildcard structures if it is needed */ - if(wc->state == CURLWC_DONE || result) - Curl_wildcard_dtor(wc); - } - if(result) returncode = result; diff --git a/lib/transfer.c b/lib/transfer.c index 5b22003dcb..72f4bd9ef5 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -1385,6 +1385,16 @@ CURLcode Curl_pretransfer(struct SessionHandle *data) consider to be fine */ data->state.authhost.picked &= data->state.authhost.want; data->state.authproxy.picked &= data->state.authproxy.want; + + if(data->set.wildcardmatch) { + struct WildcardData *wc = &data->wildcard; + if(!wc->filelist) { + result = Curl_wildcard_init(wc); /* init wildcard structures */ + if(result) + return CURLM_OUT_OF_MEMORY; + } + } + } return result; diff --git a/lib/url.c b/lib/url.c index f897f53449..2a30266507 100644 --- a/lib/url.c +++ b/lib/url.c @@ -484,6 +484,12 @@ CURLcode Curl_close(struct SessionHandle *data) Curl_share_unlock(data, CURL_LOCK_DATA_SHARE); } + if(data->set.wildcardmatch) { + /* destruct wildcard structures if it is needed */ + struct WildcardData *wc = &data->wildcard; + Curl_wildcard_dtor(wc); + } + Curl_freeset(data); free(data); return CURLE_OK;