diff --git a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c index d7f3595b88..4a2b1db7fb 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c @@ -1056,35 +1056,42 @@ void __init ath79_set_mac_base(unsigned char *mac) memcpy(ath79_mac_base, mac, ETH_ALEN); } -void __init ath79_parse_mac_addr(char *mac_str) +void __init ath79_parse_ascii_mac(char *mac_str, u8 *mac) { - u8 tmp[ETH_ALEN]; int t; t = sscanf(mac_str, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", - &tmp[0], &tmp[1], &tmp[2], &tmp[3], &tmp[4], &tmp[5]); + &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]); if (t != ETH_ALEN) t = sscanf(mac_str, "%02hhx.%02hhx.%02hhx.%02hhx.%02hhx.%02hhx", - &tmp[0], &tmp[1], &tmp[2], &tmp[3], &tmp[4], &tmp[5]); + &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]); - if (t == ETH_ALEN) - ath79_set_mac_base(tmp); - else - printk(KERN_DEBUG "ar71xx: failed to parse mac address " - "\"%s\"\n", mac_str); + if (t != ETH_ALEN || !is_valid_ether_addr(mac)) { + memset(mac, 0, ETH_ALEN); + printk(KERN_DEBUG "ar71xx: invalid mac address \"%s\"\n", + mac_str); + } +} + +static void __init ath79_set_mac_base_ascii(char *str) +{ + u8 mac[ETH_ALEN]; + + ath79_parse_ascii_mac(str, mac); + ath79_set_mac_base(mac); } static int __init ath79_ethaddr_setup(char *str) { - ath79_parse_mac_addr(str); + ath79_set_mac_base_ascii(str); return 1; } __setup("ethaddr=", ath79_ethaddr_setup); static int __init ath79_kmac_setup(char *str) { - ath79_parse_mac_addr(str); + ath79_set_mac_base_ascii(str); return 1; } __setup("kmac=", ath79_kmac_setup); diff --git a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.h b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.h index 561bf3ff86..bc608dac07 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.h +++ b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.h @@ -17,7 +17,7 @@ struct platform_device; extern unsigned char ath79_mac_base[] __initdata; -void ath79_parse_mac_addr(char *mac_str); +void ath79_parse_ascii_mac(char *mac_str, u8 *mac); void ath79_init_mac(unsigned char *dst, const unsigned char *src, int offset); void ath79_init_local_mac(unsigned char *dst, const unsigned char *src);