ifupdown: do not fail if interface disappears during ifdown
authorKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>
Tue, 27 Mar 2018 22:00:03 +0000 (00:00 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 27 Mar 2018 22:02:52 +0000 (00:02 +0200)
Interface may not exist because it got deleted by an ifdown hook script
earlier. This may happen when a virtual interface, such as VLAN, has multiple
iface blocks defined.

function                                             old     new   delta
static_down6                                          14      40     +26
static_down                                           54      70     +16
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 42/0)               Total: 42 bytes

Signed-off-by: Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/ifupdown.c

index 534c9f0c7988caf32bb948cfb9e5c31cf26e1af8..5481134e513db7a1f2763e2ae9bc80d59e2843de 100644 (file)
 //usage:     "\n       -v      Print out what would happen before doing it"
 //usage:     "\n       -f      Force deconfiguration"
 
+#include <net/if.h>
 #include "libbb.h"
 #include "common_bufsiz.h"
 /* After libbb.h, since it needs sys/types.h on some systems */
@@ -503,6 +504,8 @@ static int FAST_FUNC static_up6(struct interface_defn_t *ifd, execfn *exec)
 
 static int FAST_FUNC static_down6(struct interface_defn_t *ifd, execfn *exec)
 {
+       if (!if_nametoindex(ifd->iface))
+               return 1; /* already gone */
 # if ENABLE_FEATURE_IFUPDOWN_IP
        return execute("ip link set %iface% down", ifd, exec);
 # else
@@ -598,6 +601,9 @@ static int FAST_FUNC static_up(struct interface_defn_t *ifd, execfn *exec)
 static int FAST_FUNC static_down(struct interface_defn_t *ifd, execfn *exec)
 {
        int result;
+
+       if (!if_nametoindex(ifd->iface))
+               return 2; /* already gone */
 # if ENABLE_FEATURE_IFUPDOWN_IP
        /* Optional "label LBL" is necessary if interface is an alias (eth0:0),
         * otherwise "ip addr flush dev eth0:0" flushes all addresses on eth0.