[PATCH] Prevent arping from freezing when no packet is received

Denys Vlasenko vda.linux at googlemail.com
Sun Feb 11 12:49:05 UTC 2018


On Fri, Feb 9, 2018 at 12:52 PM, Ortmann, Michael
<m.ortmann at lxinstruments.com> wrote:
> Hello,
>
>
>
> I ran into a case where a call like “arping -D -c 2 -I eth0 10.0.0.64” would
> freeze forever. It is caused by a blocking recfrom call at the end of the
> code. Turns out this was already fixed in the original iputils code. The
> following patch is just a port from iputils which can be found here:
> https://github.com/iputils/iputils/blob/master/arping.c
>
> It also fixes another problem that can occur when the Ethernet connection is
> down.
>
>
>
> I successfully tested the code change with busybox 1.24.1. It should also
> work with the current version since this part of the code has not changed
> since then. The following patch is for the current version.
>
>
>
> Regards,
>
> Michael
>
>
>
> --- a/networking/arping.c            2018-02-09 11:50:56.551059773 +0100
>
> +++ b/networking/arping.c         2018-02-09 11:54:37.494598160 +0100
>
> @@ -423,16 +423,25 @@
>
>                                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 and
> no packet
>
> +                             * is received. */
>
> +                             sigprocmask(SIG_UNBLOCK, &sset, &osset);
>
>                                 cc = recvfrom(sock_fd, packet, 4096, 0,
> (struct sockaddr *) &from, &alen);
>
>                                if (cc < 0) {
>
>                                                bb_perror_msg("recvfrom");
>
> +                                             if (errno == ENETDOWN)
>
> +                                                             exit(2);
>
>                                                continue;
>
>                                }
>
> -                              sigemptyset(&sset);
>
> -                              sigaddset(&sset, SIGALRM);
>
> -                              sigaddset(&sset, SIGINT);
>
> -                              sigprocmask(SIG_BLOCK, &sset, &osset);
>
> +
>
> +                             sigprocmask(SIG_BLOCK, &sset, NULL);
>
>                                recv_pack(packet, cc, &from);
>
>                                sigprocmask(SIG_SETMASK, &osset, NULL);
>
>                }

The last sigprocmask(SIG_SETMASK) is now pointless, right?


More information about the busybox mailing list