Re: [PATCH] MIPS: BCM47XX: Fix some very confused types and data corruption

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/07/2013 12:56 AM, Ilia Mirkin wrote:
> Fix nvram_read_alpha2 copying too many bytes over the ssb_sprom
> structure. Also fix the arguments of the read_macaddr, although the code
> was technically not wrong before due to an extra dereference.
> 
> Signed-off-by: Ilia Mirkin <imirkin@xxxxxxxxxxxx>

Acked-by: Hauke Mehrtens <hauke@xxxxxxxxxx>

This patch looks good to me. I have build tested it.

There was a similar patch on the mailing list but it did not get it into
3.13-rc1, this will supersede that patch:
http://patchwork.linux-mips.org/patch/5862/

> ---
> 
> I found this with coccinelle. Looking over the code, I'm pretty sure the below
> patch was the original intent. Or it is I that may be very confused. But if
> you have an argument like T foo[6], it's essentially equivalent to having an
> agument of T *foo. I don't even know what &foo.x does when x is declared as
> T[2]. Right now the memcpy is copying sizeof(val), which is char *val[2], and
> while I'm not 100% sure how sizeof works in this situation, that will
> translate to either sizeof(void*) or 2*sizeof(void*). I believe the intent was
> to only copy 2 bytes, since that is the size of the alpha2 field.
> 
> The macaddress situation is similar, except that the argument actually gets
> dereferenced, so it all works out. But I don't think that's necessary.
> 
> All that said, I haven't even build-tested this (no MIPS toolchain handy). But
> hopefully this will make sense to someone.
> 
>  arch/mips/bcm47xx/sprom.c | 18 +++++++++---------
>  1 file changed, 9 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/mips/bcm47xx/sprom.c b/arch/mips/bcm47xx/sprom.c
> index ad03c93..a8b5408 100644
> --- a/arch/mips/bcm47xx/sprom.c
> +++ b/arch/mips/bcm47xx/sprom.c
> @@ -135,7 +135,7 @@ static void nvram_read_leddc(const char *prefix, const char *name,
>  }
>  
>  static void nvram_read_macaddr(const char *prefix, const char *name,
> -			       u8 (*val)[6], bool fallback)
> +			       u8 val[6], bool fallback)
>  {
>  	char buf[100];
>  	int err;
> @@ -144,11 +144,11 @@ static void nvram_read_macaddr(const char *prefix, const char *name,
>  	if (err < 0)
>  		return;
>  
> -	bcm47xx_nvram_parse_macaddr(buf, *val);
> +	bcm47xx_nvram_parse_macaddr(buf, val);
>  }
>  
>  static void nvram_read_alpha2(const char *prefix, const char *name,
> -			     char (*val)[2], bool fallback)
> +			     char val[2], bool fallback)
>  {
>  	char buf[10];
>  	int err;
> @@ -162,7 +162,7 @@ static void nvram_read_alpha2(const char *prefix, const char *name,
>  		pr_warn("alpha2 is too long %s\n", buf);
>  		return;
>  	}
> -	memcpy(val, buf, sizeof(val));
> +	memcpy(val, buf, 2);
>  }
>  
>  static void bcm47xx_fill_sprom_r1234589(struct ssb_sprom *sprom,
> @@ -180,7 +180,7 @@ static void bcm47xx_fill_sprom_r1234589(struct ssb_sprom *sprom,
>  		      fallback);
>  	nvram_read_s8(prefix, NULL, "ag1", &sprom->antenna_gain.a1, 0,
>  		      fallback);
> -	nvram_read_alpha2(prefix, "ccode", &sprom->alpha2, fallback);
> +	nvram_read_alpha2(prefix, "ccode", sprom->alpha2, fallback);
>  }
>  
>  static void bcm47xx_fill_sprom_r12389(struct ssb_sprom *sprom,
> @@ -633,20 +633,20 @@ static void bcm47xx_fill_sprom_path_r45(struct ssb_sprom *sprom,
>  static void bcm47xx_fill_sprom_ethernet(struct ssb_sprom *sprom,
>  					const char *prefix, bool fallback)
>  {
> -	nvram_read_macaddr(prefix, "et0macaddr", &sprom->et0mac, fallback);
> +	nvram_read_macaddr(prefix, "et0macaddr", sprom->et0mac, fallback);
>  	nvram_read_u8(prefix, NULL, "et0mdcport", &sprom->et0mdcport, 0,
>  		      fallback);
>  	nvram_read_u8(prefix, NULL, "et0phyaddr", &sprom->et0phyaddr, 0,
>  		      fallback);
>  
> -	nvram_read_macaddr(prefix, "et1macaddr", &sprom->et1mac, fallback);
> +	nvram_read_macaddr(prefix, "et1macaddr", sprom->et1mac, fallback);
>  	nvram_read_u8(prefix, NULL, "et1mdcport", &sprom->et1mdcport, 0,
>  		      fallback);
>  	nvram_read_u8(prefix, NULL, "et1phyaddr", &sprom->et1phyaddr, 0,
>  		      fallback);
>  
> -	nvram_read_macaddr(prefix, "macaddr", &sprom->il0mac, fallback);
> -	nvram_read_macaddr(prefix, "il0macaddr", &sprom->il0mac, fallback);
> +	nvram_read_macaddr(prefix, "macaddr", sprom->il0mac, fallback);
> +	nvram_read_macaddr(prefix, "il0macaddr", sprom->il0mac, fallback);
>  }
>  
>  static void bcm47xx_fill_board_data(struct ssb_sprom *sprom, const char *prefix,
> 



[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux