summaryrefslogtreecommitdiffstats
path: root/src/hci/commands
diff options
context:
space:
mode:
authorMichael Brown2013-07-15 17:30:39 +0200
committerMichael Brown2013-07-15 17:35:48 +0200
commited28c8304c1653a340088137966fff56bae15ad0 (patch)
treeb24455c38cbf95e3786ea1279664990df3c29bf6 /src/hci/commands
parent[build] Include ipxe.pxe in default build (diff)
downloadipxe-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.c7
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;