From e015d0659fd3039c321b179190834c7e5909522a Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 11 Feb 2018 13:48:52 +0100 Subject: [PATCH] arping: fix the case when inherited signal mask masks out ALRM function old new delta arping_main 1629 1635 +6 Signed-off-by: Denys Vlasenko --- networking/arping.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/networking/arping.c b/networking/arping.c index 898c3054e..97e9e680a 100644 --- a/networking/arping.c +++ b/networking/arping.c @@ -413,28 +413,37 @@ int arping_main(int argc UNUSED_PARAM, char **argv) printf(" from %s %s\n", inet_ntoa(src), device); } + packet = xmalloc(4096); + signal_SA_RESTART_empty_mask(SIGINT, (void (*)(int))finish); signal_SA_RESTART_empty_mask(SIGALRM, (void (*)(int))catcher); + /* Send the first packet, arm ALRM */ catcher(); - packet = xmalloc(4096); while (1) { - sigset_t sset, osset; + sigset_t sset; struct sockaddr_ll from; socklen_t alen = sizeof(from); int cc; + sigemptyset(&sset); + sigaddset(&sset, SIGALRM); + sigaddset(&sset, SIGINT); + /* Unblock SIGALRM so that the previously called alarm() + * can prevent recvfrom from blocking forever in case the + * inherited procmask is blocking SIGALRM. + */ + sigprocmask(SIG_UNBLOCK, &sset, NULL); + cc = recvfrom(sock_fd, packet, 4096, 0, (struct sockaddr *) &from, &alen); + + /* Don't allow SIGALRMs while we process the reply */ + sigprocmask(SIG_BLOCK, &sset, NULL); if (cc < 0) { bb_perror_msg("recvfrom"); continue; } - sigemptyset(&sset); - sigaddset(&sset, SIGALRM); - sigaddset(&sset, SIGINT); - sigprocmask(SIG_BLOCK, &sset, &osset); recv_pack(packet, cc, &from); - sigprocmask(SIG_SETMASK, &osset, NULL); } }