ifupdown: correct ifstate update during 'ifup -a'. Closes 6212
authorFrank Bergmann <frank.frajasalo@googlemail.com>
Fri, 13 Mar 2015 09:05:08 +0000 (10:05 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 22 Mar 2015 16:04:27 +0000 (17:04 +0100)
When 'if -a' runs into an failure on an interface all further
interfaces won't be correctly updated in ifstate. This patch
inserts a new variable that only tracks the current interfaces
failure so that the write to ifstate can rely on this and not
the one for the functions return value.

Fixes https://bugs.busybox.net/show_bug.cgi?id=6212

Signed-off-by: Frank Bergmann <frank.frajasalo@googlemail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/ifupdown.c

index daabeec0cce5c403f0fb94b9266ae04ad82911b3..9f2500331b409d81c3a1f36ad46b5b7e32784d1e 100644 (file)
@@ -1239,6 +1239,7 @@ int ifupdown_main(int argc UNUSED_PARAM, char **argv)
                char *pch;
                bool okay = 0;
                int cmds_ret;
+               bool curr_failure = 0;
 
                iface = xstrdup(target_list->data);
                target_list = target_list->link;
@@ -1306,9 +1307,9 @@ int ifupdown_main(int argc UNUSED_PARAM, char **argv)
                                if (cmds_ret == -1) {
                                        bb_error_msg("don't seem to have all the variables for %s/%s",
                                                        liface, currif->address_family->name);
-                                       any_failures = 1;
+                                       any_failures = curr_failure = 1;
                                } else if (cmds_ret == 0) {
-                                       any_failures = 1;
+                                       any_failures = curr_failure = 1;
                                }
 
                                currif->iface = oldiface;
@@ -1329,7 +1330,7 @@ int ifupdown_main(int argc UNUSED_PARAM, char **argv)
                        llist_t *state_list = read_iface_state();
                        llist_t *iface_state = find_iface_state(state_list, iface);
 
-                       if (cmds == iface_up && !any_failures) {
+                       if (cmds == iface_up && !curr_failure) {
                                char *newiface = xasprintf("%s=%s", iface, liface);
                                if (!iface_state) {
                                        llist_add_to_end(&state_list, newiface);