diff options
author | Daniel Stenberg <daniel@haxx.se> | 2014-02-17 10:35:21 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2014-02-17 10:35:21 +0100 |
commit | 854aca5420f81d4be242592bec401e1f66ee4070 (patch) | |
tree | 83b7ade5f45ac27ba2a137c12f147218154718b5 /lib | |
parent | 4b4e8a5853dbda897fad0321b2cbebfb36dfe012 (diff) |
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.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/multi.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/lib/multi.c b/lib/multi.c index 02d225759..4a0374971 100644 --- a/lib/multi.c +++ b/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 |