aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2014-02-17 10:35:21 +0100
committerDaniel Stenberg <daniel@haxx.se>2014-02-17 10:35:21 +0100
commit854aca5420f81d4be242592bec401e1f66ee4070 (patch)
tree83b7ade5f45ac27ba2a137c12f147218154718b5
parent4b4e8a5853dbda897fad0321b2cbebfb36dfe012 (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.c11
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