diff options
author | Michael Brown | 2013-07-15 17:30:39 +0200 |
---|---|---|
committer | Michael Brown | 2013-07-15 17:35:48 +0200 |
commit | ed28c8304c1653a340088137966fff56bae15ad0 (patch) | |
tree | b24455c38cbf95e3786ea1279664990df3c29bf6 /src/hci/commands | |
parent | [build] Include ipxe.pxe in default build (diff) | |
download | ipxe-ed28c8304c1653a340088137966fff56bae15ad0.tar.gz ipxe-ed28c8304c1653a340088137966fff56bae15ad0.tar.xz ipxe-ed28c8304c1653a340088137966fff56bae15ad0.zip |
[ifmgmt] Avoid relying on global variable within ifcommon_exec()
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 <robin@smidsrod.no>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/hci/commands')
-rw-r--r-- | src/hci/commands/ifmgmt_cmd.c | 7 |
1 files 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; |