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
This commit is contained in:
Daniel Stenberg 2016-05-15 00:37:36 +02:00
Родитель e1372418cd
Коммит cba9621342
3 изменённых файлов: 16 добавлений и 15 удалений

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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