From: Thomas Markwalder Date: Wed, 5 Nov 2014 12:31:17 +0000 (-0500) Subject: [master] Set signal action to ingore for SIGPIPE X-Git-Tag: v4_3_2.pre-beta~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6067cd48daa03514267859ca4b52fa0dc57dfc74;p=thirdparty%2Fdhcp.git [master] Set signal action to ingore for SIGPIPE Merges in rt32222. --- diff --git a/RELNOTES b/RELNOTES index a01b7d928..aad275320 100644 --- a/RELNOTES +++ b/RELNOTES @@ -129,6 +129,12 @@ by Eric Young (eay@cryptsoft.com). BOOTP request handling. [ISC-Bugs #36233] +- Added logic to ignore the signal, SIGPIPE, which ensures write failures + will be delivered as errors rather than as SIGPIPE signals on all OSs. + Thanks to Marius Tomaschewski from SUSE who reported the issue and provided + the patch upon which the fix is based. + [ISC-Bugs #32222] + Changes since 4.3.1b1 - Modify the linux and openwrt dhclient scripts to process information diff --git a/omapip/isclib.c b/omapip/isclib.c index 3e5e1c2b3..13f0d3ebc 100644 --- a/omapip/isclib.c +++ b/omapip/isclib.c @@ -120,6 +120,20 @@ isclib_cleanup(void) return; } +/* Installs a handler for a signal using sigaction */ +static void +handle_signal(int sig, void (*handler)(int)) { + struct sigaction sa; + + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = handler; + sigfillset(&sa.sa_mask); + if (sigaction(sig, &sa, NULL) != 0) { + log_debug("handle_signal() failed for signal %d error: %s", + sig, strerror(errno)); + } +} + isc_result_t dhcp_context_create(int flags, struct in_addr *local4, @@ -176,6 +190,11 @@ dhcp_context_create(int flags, return (result); dhcp_gbl_ctx.actx_started = ISC_TRUE; + /* Not all OSs support suppressing SIGPIPE through socket + * options, so set the sigal action to be ignore. This allows + * broken connections to fail gracefully with EPIPE on writes */ + handle_signal(SIGPIPE, SIG_IGN); + result = isc_taskmgr_createinctx(dhcp_gbl_ctx.mctx, dhcp_gbl_ctx.actx, 1, 0,