Skip to content

Commit

Permalink
MIPS: BCM63XX: Properly handle mac address octet overflow
Browse files Browse the repository at this point in the history
While calculating the mac address the pointer for the current octet was
never reset back to the least significant one after being decremented
because of an octet overflow. This resulted in the code continuing to
increment at the current octet, potentially generating duplicate or
invalid mac addresses.

As a second issue the pointer was allowed to advance up to the most
significant octet, modifying the OUI, and potentially changing the type
of mac address.

Rewrite the code so it resets the pointer to the least significant
in each outer loop step, and bails out when the least significant octet
of the OUI is reached.

Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
Cc: linux-mips@linux-mips.org
Cc: Maxime Bizon <mbizon@freebox.fr>
Cc: Florian Fainelli <florian@openwrt.org>
Cc: Sergei Shtylyov <sshtylyov@mvista.com>
Patchwork: https://patchwork.linux-mips.org/patch/4348/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
  • Loading branch information
Jonas Gorski authored and Ralf Baechle committed Oct 1, 2012
1 parent 0b3e06f commit d21a771
Showing 1 changed file with 9 additions and 7 deletions.
16 changes: 9 additions & 7 deletions arch/mips/bcm63xx/boards/board_bcm963xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -720,7 +720,7 @@ const char *board_get_name(void)
*/
static int board_get_mac_address(u8 *mac)
{
u8 *p;
u8 *oui;
int count;

if (mac_addr_used >= nvram.mac_addr_count) {
Expand All @@ -729,21 +729,23 @@ static int board_get_mac_address(u8 *mac)
}

memcpy(mac, nvram.mac_addr_base, ETH_ALEN);
p = mac + ETH_ALEN - 1;
oui = mac + ETH_ALEN/2 - 1;
count = mac_addr_used;

while (count--) {
u8 *p = mac + ETH_ALEN - 1;

do {
(*p)++;
if (*p != 0)
break;
p--;
} while (p != mac);
}
} while (p != oui);

if (p == mac) {
printk(KERN_ERR PFX "unable to fetch mac address\n");
return -ENODEV;
if (p == oui) {
printk(KERN_ERR PFX "unable to fetch mac address\n");
return -ENODEV;
}
}

mac_addr_used++;
Expand Down

0 comments on commit d21a771

Please sign in to comment.