]> code.ossystems Code Review - openembedded-core.git/commitdiff
iputils: backport patch to fix arping hang problem
authorChen Qi <Qi.Chen@windriver.com>
Thu, 7 Sep 2017 02:37:10 +0000 (10:37 +0800)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Mon, 11 Sep 2017 16:30:13 +0000 (17:30 +0100)
arping hangs if SIGALARM is blocked. Backport a patch to fix this problem.

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.

Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
meta/recipes-extended/iputils/files/arping-fix-arping-hang-if-SIGALRM-is-blocked.patch [new file with mode: 0644]
meta/recipes-extended/iputils/iputils_s20151218.bb

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 (file)
index 0000000..7b56276
--- /dev/null
@@ -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);
+       }
index 0d4dd1b17c5812c40b2a3666e091f74a087869d5..46de6fc44464edfc1165f4a396a1ddc4954ceab1 100644 (file)
@@ -20,6 +20,7 @@ SRC_URI = "http://www.skbuff.net/iputils/${BPN}-${PV}.tar.bz2 \
            file://nsgmls-path-fix.patch \
            file://0001-Fix-header-inclusion-for-musl.patch \
            file://0001-Intialize-struct-elements-by-name.patch \
+           file://arping-fix-arping-hang-if-SIGALRM-is-blocked.patch \
           "
 
 SRC_URI[md5sum] = "8aaa7395f27dff9f57ae016d4bc753ce"