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 | |
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.
-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 |