aboutsummaryrefslogtreecommitdiff
path: root/lib/multi.c
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 /lib/multi.c
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.
Diffstat (limited to 'lib/multi.c')
-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