aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-extended/iputils/files/arping-fix-arping-hang-if-SIGALRM-is-blocked.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-extended/iputils/files/arping-fix-arping-hang-if-SIGALRM-is-blocked.patch')
-rw-r--r--meta/recipes-extended/iputils/files/arping-fix-arping-hang-if-SIGALRM-is-blocked.patch44
1 files changed, 44 insertions, 0 deletions
diff --git a/meta/recipes-extended/iputils/files/arping-fix-arping-hang-if-SIGALRM-is-blocked.patch b/meta/recipes-extended/iputils/files/arping-fix-arping-hang-if-SIGALRM-is-blocked.patch
new file mode 100644
index 0000000000..7b56276b39
--- /dev/null
+++ b/meta/recipes-extended/iputils/files/arping-fix-arping-hang-if-SIGALRM-is-blocked.patch
@@ -0,0 +1,44 @@
+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);
+ }