Patchwork [RFC/PATCH] doc2000: Fix uninitialized variable in doc_ecc_decode()

login
register
mail settings
Submitter Mark Ware
Date May 27, 2010, 1:45 a.m.
Message ID <4BFDCEC3.7070601@elphinstone.net>
Download mbox | patch
Permalink /patch/53677/
State Accepted
Commit c9fb67735b307a3cdf57e568b6c50c860248d1d3
Headers show

Comments

Mark Ware - May 27, 2010, 1:45 a.m.
The variable 'syn' was being used uninitialized.  Also
fixed incorrect use of syn[] vs s[].

Tested on powerpc board with 64MB DOC2000.
---

I am porting from a 2.4.18 kernel to 2.6.32, and I saw random media header
mismatches causing a failure to detect the DOC device partitions.  Tracing
through, I saw this variable being used uninitialized and I suspect
incorrectly also.

I do not really understand how the ecc/syndrome code works, so I do not
know if this patch is the correct solution, but it did make my problem
go away...

CC: Thomas Gleixner as I believe he may have written this function initially.

 drivers/mtd/nand/diskonchip.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)
Mark Ware - June 17, 2010, 4:44 a.m.
No comments?
I know DOC2000 is pretty old now, but somebody must remember them!

Regards,
Mark

Mark Ware wrote:
> The variable 'syn' was being used uninitialized.  Also
> fixed incorrect use of syn[] vs s[].
> 
> Tested on powerpc board with 64MB DOC2000.
> ---
> 
> I am porting from a 2.4.18 kernel to 2.6.32, and I saw random media header
> mismatches causing a failure to detect the DOC device partitions.  Tracing
> through, I saw this variable being used uninitialized and I suspect
> incorrectly also.
> 
> I do not really understand how the ecc/syndrome code works, so I do not
> know if this patch is the correct solution, but it did make my problem
> go away...
> 
> CC: Thomas Gleixner as I believe he may have written this function initially.
> 
>  drivers/mtd/nand/diskonchip.c |    5 +++--
>  1 files changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c
> index a5bf9ff..7da2321 100644
> --- a/drivers/mtd/nand/diskonchip.c
> +++ b/drivers/mtd/nand/diskonchip.c
> @@ -145,6 +145,7 @@ static int doc_ecc_decode(struct rs_control *rs, uint8_t *data, uint8_t *ecc)
>  	uint8_t parity;
>  	uint16_t ds[4], s[5], tmp, errval[8], syn[4];
>  
> +	memset(syn, 0, sizeof(syn));
>  	/* Convert the ecc bytes into words */
>  	ds[0] = ((ecc[4] & 0xff) >> 0) | ((ecc[5] & 0x03) << 8);
>  	ds[1] = ((ecc[5] & 0xfc) >> 2) | ((ecc[2] & 0x0f) << 6);
> @@ -168,9 +169,9 @@ static int doc_ecc_decode(struct rs_control *rs, uint8_t *data, uint8_t *ecc)
>  			s[i] ^= rs->alpha_to[rs_modnn(rs, tmp + (FCR + i) * j)];
>  	}
>  
> -	/* Calc s[i] = s[i] / alpha^(v + i) */
> +	/* Calc syn[i] = s[i] / alpha^(v + i) */
>  	for (i = 0; i < NROOTS; i++) {
> -		if (syn[i])
> +		if (s[i])
>  			syn[i] = rs_modnn(rs, rs->index_of[s[i]] + (NN - FCR - i));
>  	}
>  	/* Call the decoder library */
Artem Bityutskiy - June 29, 2010, 3:46 a.m.
On Thu, 2010-05-27 at 11:45 +1000, Mark Ware wrote:
> The variable 'syn' was being used uninitialized.  Also
> fixed incorrect use of syn[] vs s[].
> 
> Tested on powerpc board with 64MB DOC2000.
> ---
> 
> I am porting from a 2.4.18 kernel to 2.6.32, and I saw random media header
> mismatches causing a failure to detect the DOC device partitions.  Tracing
> through, I saw this variable being used uninitialized and I suspect
> incorrectly also.
> 
> I do not really understand how the ecc/syndrome code works, so I do not
> know if this patch is the correct solution, but it did make my problem
> go away...
> 
> CC: Thomas Gleixner as I believe he may have written this function initially.
> 
>  drivers/mtd/nand/diskonchip.c |    5 +++--
>  1 files changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c
> index a5bf9ff..7da2321 100644
> --- a/drivers/mtd/nand/diskonchip.c
> +++ b/drivers/mtd/nand/diskonchip.c
> @@ -145,6 +145,7 @@ static int doc_ecc_decode(struct rs_control *rs, uint8_t *data, uint8_t *ecc)
>  	uint8_t parity;
>  	uint16_t ds[4], s[5], tmp, errval[8], syn[4];
>  
> +	memset(syn, 0, sizeof(syn));

I also do not know the math of this stuff, but this change is not
needed ...

>  	/* Convert the ecc bytes into words */
>  	ds[0] = ((ecc[4] & 0xff) >> 0) | ((ecc[5] & 0x03) << 8);
>  	ds[1] = ((ecc[5] & 0xfc) >> 2) | ((ecc[2] & 0x0f) << 6);
> @@ -168,9 +169,9 @@ static int doc_ecc_decode(struct rs_control *rs, uint8_t *data, uint8_t *ecc)
>  			s[i] ^= rs->alpha_to[rs_modnn(rs, tmp + (FCR + i) * j)];
>  	}
>  
> -	/* Calc s[i] = s[i] / alpha^(v + i) */
> +	/* Calc syn[i] = s[i] / alpha^(v + i) */
>  	for (i = 0; i < NROOTS; i++) {
> -		if (syn[i])
> +		if (s[i])
>  			syn[i] = rs_modnn(rs, rs->index_of[s[i]] + (NN - FCR - i));
>  	}

... after this change, right?
Artem Bityutskiy - June 29, 2010, 3:58 a.m.
On Tue, 2010-06-29 at 06:46 +0300, Artem Bityutskiy wrote:
> On Thu, 2010-05-27 at 11:45 +1000, Mark Ware wrote:
> > The variable 'syn' was being used uninitialized.  Also
> > fixed incorrect use of syn[] vs s[].
> > 
> > Tested on powerpc board with 64MB DOC2000.
> > ---
> > 
> > I am porting from a 2.4.18 kernel to 2.6.32, and I saw random media header
> > mismatches causing a failure to detect the DOC device partitions.  Tracing
> > through, I saw this variable being used uninitialized and I suspect
> > incorrectly also.
> > 
> > I do not really understand how the ecc/syndrome code works, so I do not
> > know if this patch is the correct solution, but it did make my problem
> > go away...
> > 
> > CC: Thomas Gleixner as I believe he may have written this function initially.
> > 
> >  drivers/mtd/nand/diskonchip.c |    5 +++--
> >  1 files changed, 3 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c
> > index a5bf9ff..7da2321 100644
> > --- a/drivers/mtd/nand/diskonchip.c
> > +++ b/drivers/mtd/nand/diskonchip.c
> > @@ -145,6 +145,7 @@ static int doc_ecc_decode(struct rs_control *rs, uint8_t *data, uint8_t *ecc)
> >  	uint8_t parity;
> >  	uint16_t ds[4], s[5], tmp, errval[8], syn[4];
> >  
> > +	memset(syn, 0, sizeof(syn));
> 
> I also do not know the math of this stuff, but this change is not
> needed ...

Sorry, ignore this, I'll put this patch to my l2-mtd-2.6 tree and let
dwmw2 decide whether it is good or not :-)
Artem Bityutskiy - June 29, 2010, 6:29 a.m.
On Thu, 2010-05-27 at 11:45 +1000, Mark Ware wrote:
> The variable 'syn' was being used uninitialized.  Also
> fixed incorrect use of syn[] vs s[].
> 
> Tested on powerpc board with 64MB DOC2000.
> ---
> 
> I am porting from a 2.4.18 kernel to 2.6.32, and I saw random media header
> mismatches causing a failure to detect the DOC device partitions.  Tracing
> through, I saw this variable being used uninitialized and I suspect
> incorrectly also.
> 
> I do not really understand how the ecc/syndrome code works, so I do not
> know if this patch is the correct solution, but it did make my problem
> go away...
> 
> CC: Thomas Gleixner as I believe he may have written this function initially.

Please, always add Signed-off-by for kernel patches. I added it for you.
Mark Ware - June 29, 2010, 6:47 a.m.
On 29/06/10 16:29, Artem Bityutskiy wrote:
> On Thu, 2010-05-27 at 11:45 +1000, Mark Ware wrote:
>> The variable 'syn' was being used uninitialized.  Also
>> fixed incorrect use of syn[] vs s[].
>>
>> Tested on powerpc board with 64MB DOC2000.
>> ---
>>
>> I am porting from a 2.4.18 kernel to 2.6.32, and I saw random media header
>> mismatches causing a failure to detect the DOC device partitions.  Tracing
>> through, I saw this variable being used uninitialized and I suspect
>> incorrectly also.
>>
>> I do not really understand how the ecc/syndrome code works, so I do not
>> know if this patch is the correct solution, but it did make my problem
>> go away...
>>
>> CC: Thomas Gleixner as I believe he may have written this function initially.
> 
> Please, always add Signed-off-by for kernel patches. I added it for you.
> 

Thanks.  I guess I expected to be told that I was smoking something and that
my DOC error disappearing was unrelated...

Mark
Artem Bityutskiy - June 29, 2010, 6:50 a.m.
On Tue, 2010-06-29 at 16:47 +1000, Mark Ware wrote:
> On 29/06/10 16:29, Artem Bityutskiy wrote:
> > On Thu, 2010-05-27 at 11:45 +1000, Mark Ware wrote:
> >> The variable 'syn' was being used uninitialized.  Also
> >> fixed incorrect use of syn[] vs s[].
> >>
> >> Tested on powerpc board with 64MB DOC2000.
> >> ---
> >>
> >> I am porting from a 2.4.18 kernel to 2.6.32, and I saw random media header
> >> mismatches causing a failure to detect the DOC device partitions.  Tracing
> >> through, I saw this variable being used uninitialized and I suspect
> >> incorrectly also.
> >>
> >> I do not really understand how the ecc/syndrome code works, so I do not
> >> know if this patch is the correct solution, but it did make my problem
> >> go away...
> >>
> >> CC: Thomas Gleixner as I believe he may have written this function initially.
> > 
> > Please, always add Signed-off-by for kernel patches. I added it for you.
> > 
> 
> Thanks.  I guess I expected to be told that I was smoking something and that
> my DOC error disappearing was unrelated...

Note, I did not really review your patch - the MTD maintainer will take
a look at it later, probably.

Patch

diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c
index a5bf9ff..7da2321 100644
--- a/drivers/mtd/nand/diskonchip.c
+++ b/drivers/mtd/nand/diskonchip.c
@@ -145,6 +145,7 @@  static int doc_ecc_decode(struct rs_control *rs, uint8_t *data, uint8_t *ecc)
 	uint8_t parity;
 	uint16_t ds[4], s[5], tmp, errval[8], syn[4];
 
+	memset(syn, 0, sizeof(syn));
 	/* Convert the ecc bytes into words */
 	ds[0] = ((ecc[4] & 0xff) >> 0) | ((ecc[5] & 0x03) << 8);
 	ds[1] = ((ecc[5] & 0xfc) >> 2) | ((ecc[2] & 0x0f) << 6);
@@ -168,9 +169,9 @@  static int doc_ecc_decode(struct rs_control *rs, uint8_t *data, uint8_t *ecc)
 			s[i] ^= rs->alpha_to[rs_modnn(rs, tmp + (FCR + i) * j)];
 	}
 
-	/* Calc s[i] = s[i] / alpha^(v + i) */
+	/* Calc syn[i] = s[i] / alpha^(v + i) */
 	for (i = 0; i < NROOTS; i++) {
-		if (syn[i])
+		if (s[i])
 			syn[i] = rs_modnn(rs, rs->index_of[s[i]] + (NN - FCR - i));
 	}
 	/* Call the decoder library */