citadel/meta/recipes-extended/iputils/files/arping-fix-arping-hang-if-SIGALRM-is-blocked.patch
brl 098b8f982b Squashed 'poky/' content from commit 4469acdf1d
git-subtree-dir: poky
git-subtree-split: 4469acdf1d0338220f3fe2ecb5e079eea6fda375
2017-12-04 16:35:29 -05:00

45 lines
1.3 KiB
Diff

arping: fix arping hang if SIGALRM is blocked
Unblock SIGALRM so that the previously called alarm() can prevent
recvfrom() from blocking forever in case the inherited procmask is
blocking SIGALRM and no packet is received.
Upstream-Status: Backport
Reported-by: Rui Prior <rprior@dcc.fc.up.pt>
RH-Bugzilla: #1085971
Signed-off-by: Jan Synacek <jsynacek@redhat.com>
Signed-off-by: Zhenbo Gao <zhenbo.gao@windriver.com>
diff --git a/arping.c.orig b/arping.c
index 35408c1..2098159 100644
--- a/arping.c.orig
+++ b/arping.c
@@ -1215,16 +1215,22 @@ main(int argc, char **argv)
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 and no packet
+ * is received. */
+ sigprocmask(SIG_UNBLOCK, &sset, &osset);
+
if ((cc = recvfrom(s, packet, sizeof(packet), 0,
(struct sockaddr *)&from, &alen)) < 0) {
perror("arping: recvfrom");
continue;
}
- sigemptyset(&sset);
- sigaddset(&sset, SIGALRM);
- sigaddset(&sset, SIGINT);
- sigprocmask(SIG_BLOCK, &sset, &osset);
+ sigprocmask(SIG_BLOCK, &sset, NULL);
recv_pack(packet, cc, (struct sockaddr_ll *)&from);
sigprocmask(SIG_SETMASK, &osset, NULL);
}