mirror of
https://github.com/curl/curl.git
synced 2024-11-21 01:16:58 +08:00
multi: ignore sigpipe internally
When the multi API is used we must also ignore SIGPIPE signals when caused by things we do, like they can easily be generated by OpenSSL.
This commit is contained in:
parent
4b4e8a5853
commit
854aca5420
11
lib/multi.c
11
lib/multi.c
@ -1744,6 +1744,7 @@ CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles)
|
||||
while(data) {
|
||||
CURLMcode result;
|
||||
struct WildcardData *wc = &data->wildcard;
|
||||
SIGPIPE_VARIABLE(pipe_st);
|
||||
|
||||
if(data->set.wildcardmatch) {
|
||||
if(!wc->filelist) {
|
||||
@ -1753,9 +1754,11 @@ CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles)
|
||||
}
|
||||
}
|
||||
|
||||
sigpipe_ignore(data, &pipe_st);
|
||||
do
|
||||
result = multi_runsingle(multi, now, data);
|
||||
while(CURLM_CALL_MULTI_PERFORM == result);
|
||||
sigpipe_restore(&pipe_st);
|
||||
|
||||
if(data->set.wildcardmatch) {
|
||||
/* destruct wildcard structures if it is needed */
|
||||
@ -2200,6 +2203,8 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
|
||||
and just move on. */
|
||||
;
|
||||
else {
|
||||
SIGPIPE_VARIABLE(pipe_st);
|
||||
|
||||
data = entry->easy;
|
||||
|
||||
if(data->magic != CURLEASY_MAGIC_NUMBER)
|
||||
@ -2225,9 +2230,11 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
|
||||
/* set socket event bitmask if they're not locked */
|
||||
data->easy_conn->cselect_bits = ev_bitmask;
|
||||
|
||||
sigpipe_ignore(data, &pipe_st);
|
||||
do
|
||||
result = multi_runsingle(multi, now, data);
|
||||
while(CURLM_CALL_MULTI_PERFORM == result);
|
||||
sigpipe_restore(&pipe_st);
|
||||
|
||||
if(data->easy_conn &&
|
||||
!(data->easy_conn->handler->flags & PROTOPT_DIRLOCK))
|
||||
@ -2265,9 +2272,13 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
|
||||
do {
|
||||
/* the first loop lap 'data' can be NULL */
|
||||
if(data) {
|
||||
SIGPIPE_VARIABLE(pipe_st);
|
||||
|
||||
sigpipe_ignore(data, &pipe_st);
|
||||
do
|
||||
result = multi_runsingle(multi, now, data);
|
||||
while(CURLM_CALL_MULTI_PERFORM == result);
|
||||
sigpipe_restore(&pipe_st);
|
||||
|
||||
if(CURLM_OK >= result)
|
||||
/* get the socket(s) and check if the state has been changed since
|
||||
|
Loading…
Reference in New Issue
Block a user