Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[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>
  • Loading branch information
mcb30 committed Jul 15, 2013
1 parent 51d1442 commit ed28c83
Showing 1 changed file with 3 additions and 4 deletions.
7 changes: 3 additions & 4 deletions src/hci/commands/ifmgmt_cmd.c
Expand Up @@ -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 */
Expand All @@ -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;
Expand Down

0 comments on commit ed28c83

Please sign in to comment.