[U-Boot] [PATCH] Fix computation in nand_util.c:get_len_incl_bad

Depending on offset, flash size and the number of bad blocks, get_len_incl_bad may return a too small value which may lead to:
1) If there are no bad blocks, nand_{read,write}_skip_bad chooses the bad block aware read/write code. This may hurt performance, but does not have any adverse effects.
2) If there are bad blocks, the nand_{read,write}_skip_bad may choose the bad block unaware read/write code (if len_incl_bad == *length) which leads to corrupted data.
Signed-off-by: Daniel Hobi daniel.hobi@schmid-telecom.ch --- @Scott: please review @Wolfgang: please consider for 2009.11
diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c index bec9277..7085d42 100644 --- a/drivers/mtd/nand/nand_util.c +++ b/drivers/mtd/nand/nand_util.c @@ -452,7 +452,7 @@ static size_t get_len_incl_bad (nand_info_t *nand, loff_t offset, len_incl_bad += block_len; offset += block_len;
- if ((offset + len_incl_bad) >= nand->size) + if (offset >= nand->size) break; }

On Tue, Dec 01, 2009 at 02:05:55PM +0100, Daniel Hobi wrote:
Depending on offset, flash size and the number of bad blocks, get_len_incl_bad may return a too small value which may lead to:
- If there are no bad blocks, nand_{read,write}_skip_bad chooses the
bad block aware read/write code. This may hurt performance, but does not have any adverse effects.
- If there are bad blocks, the nand_{read,write}_skip_bad may choose
the bad block unaware read/write code (if len_incl_bad == *length) which leads to corrupted data.
It could also lead to the rejection of accesses near the end of flash.
Signed-off-by: Daniel Hobi daniel.hobi@schmid-telecom.ch
@Scott: please review @Wolfgang: please consider for 2009.11
Applied to next. I think it's too late for 2009.12, since it's supposed to be released tomorrow according to http://www.denx.de/wiki/U-Boot/ReleaseCycle, and it's not a regression from the previous version.
-Scott

Dear Scott Wood,
In message 20091201235510.GA19547@loki.buserror.net you wrote:
@Scott: please review @Wolfgang: please consider for 2009.11
Applied to next. I think it's too late for 2009.12, since it's supposed to be released tomorrow according to http://www.denx.de/wiki/U-Boot/ReleaseCycle, and it's not a regression from the previous version.
Heh. We don't even have -rc2 yet.
Please feel free to send me a pull request if you consider it a fix.
Best regards,
Wolfgang Denk

Dear Daniel Hobi,
In message 1259672755-929-1-git-send-email-daniel.hobi@schmid-telecom.ch you wrote:
Depending on offset, flash size and the number of bad blocks, get_len_incl_bad may return a too small value which may lead to:
- If there are no bad blocks, nand_{read,write}_skip_bad chooses the
bad block aware read/write code. This may hurt performance, but does not have any adverse effects.
- If there are bad blocks, the nand_{read,write}_skip_bad may choose
the bad block unaware read/write code (if len_incl_bad == *length) which leads to corrupted data.
Signed-off-by: Daniel Hobi daniel.hobi@schmid-telecom.ch
@Scott: please review @Wolfgang: please consider for 2009.11
diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c
Applied, thanks.
Best regards,
Wolfgang Denk
participants (3)
-
Daniel Hobi
-
Scott Wood
-
Wolfgang Denk