From ed28c8304c1653a340088137966fff56bae15ad0 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 15 Jul 2013 17:30:39 +0200 Subject: [PATCH] [ifmgmt] Avoid relying on global variable within ifcommon_exec() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The getopt API defines optind as a global variable. When used by the "autoboot" command, the payload function passed to ifcommon_exec() may result in a new iPXE script being executed; the commands therein would then overwrite the value of optind. On returning, ifcommon_exec() would continue processing the list of interfaces from an undefined point. Fix by using a local variable to hold the index within the list of interfaces. Reported-by: Robin Smidsrød Signed-off-by: Michael Brown --- src/hci/commands/ifmgmt_cmd.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/hci/commands/ifmgmt_cmd.c b/src/hci/commands/ifmgmt_cmd.c index 3f3f6b51..350f14d0 100644 --- a/src/hci/commands/ifmgmt_cmd.c +++ b/src/hci/commands/ifmgmt_cmd.c @@ -53,6 +53,7 @@ int ifcommon_exec ( int argc, char **argv, int stop_on_first_success ) { struct ifcommon_options opts; struct net_device *netdev; + int i; int rc; /* Parse options */ @@ -61,11 +62,9 @@ int ifcommon_exec ( int argc, char **argv, if ( optind != argc ) { /* Treat arguments as a list of interfaces to try */ - while ( optind != argc ) { - if ( ( rc = parse_netdev ( argv[optind++], - &netdev ) ) != 0 ) { + for ( i = optind ; i < argc ; i++ ) { + if ( ( rc = parse_netdev ( argv[i], &netdev ) ) != 0 ) continue; - } if ( ( ( rc = payload ( netdev ) ) == 0 ) && stop_on_first_success ) { return 0;