From: Harlan Stenn Date: Sat, 22 Feb 2014 05:25:52 +0000 (+0000) Subject: [Bug 2565] Handle EINTR on getifaddrs() X-Git-Tag: NTP_4_2_7P423~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=319604e0da6dff55d983be74339e2ab4f0641ad0;p=thirdparty%2Fntp.git [Bug 2565] Handle EINTR on getifaddrs() bk: 530834e0T9mMEaY3cfMKBS1dwYmGcQ --- diff --git a/ChangeLog b/ChangeLog index 399dcd8ae..86f70eda1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,4 @@ +* [Bug 2565] Handle EINTR on getifaddrs(). (4.2.7p422) 2014/02/17 Released by Harlan Stenn * [Bug 2536] ntpd sandboxing support (libseccomp2). (4.2.7p421) 2014/02/10 Released by Harlan Stenn diff --git a/lib/isc/unix/ifiter_getifaddrs.c b/lib/isc/unix/ifiter_getifaddrs.c index 1fe575356..a15d21f50 100644 --- a/lib/isc/unix/ifiter_getifaddrs.c +++ b/lib/isc/unix/ifiter_getifaddrs.c @@ -55,6 +55,7 @@ isc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp) { isc_interfaceiter_t *iter; isc_result_t result; char strbuf[ISC_STRERRORSIZE]; + int trys; REQUIRE(mctx != NULL); REQUIRE(iterp != NULL); @@ -86,17 +87,23 @@ isc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp) { iter->valid = ISC_R_FAILURE; #endif - if (getifaddrs(&iter->ifaddrs) < 0) { - isc__strerror(errno, strbuf, sizeof(strbuf)); - UNEXPECTED_ERROR(__FILE__, __LINE__, - isc_msgcat_get(isc_msgcat, - ISC_MSGSET_IFITERGETIFADDRS, - ISC_MSG_GETIFADDRS, - "getting interface " - "addresses: getifaddrs: %s"), - strbuf); - result = ISC_R_UNEXPECTED; - goto failure; + for (trys = 0; trys < 3; trys++) { + if (getifaddrs(&iter->ifaddrs) < 0) { + if (errno == EINTR) + continue; + + isc__strerror(errno, strbuf, sizeof(strbuf)); + UNEXPECTED_ERROR(__FILE__, __LINE__, + isc_msgcat_get(isc_msgcat, + ISC_MSGSET_IFITERGETIFADDRS, + ISC_MSG_GETIFADDRS, + "getting interface " + "addresses: getifaddrs: %s"), + strbuf); + result = ISC_R_UNEXPECTED; + goto failure; + } + break; } /*