mirror of
https://github.com/xcat2/xNBA.git
synced 2024-11-26 03:09:12 +00:00
[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>
This commit is contained in:
parent
51d14424bf
commit
ed28c8304c
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user