mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-26 22:52:34 +02:00
Fix selfcheck of various arrays
Stefan Reinauer has reported ridiculous NULL checks for arrays in our self_check function found by Coverity (CID1130005). This patch removes the useless checks but keeps and fixes the one responsible for the flashchips array by exporting the array size in a new constant. Corresponding to flashrom svn r1799. Signed-off-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at> Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
This commit is contained in:
parent
6455dff07b
commit
96658be407
1
flash.h
1
flash.h
@ -225,6 +225,7 @@ struct flashctx {
|
|||||||
#define TIMING_ZERO -2
|
#define TIMING_ZERO -2
|
||||||
|
|
||||||
extern const struct flashchip flashchips[];
|
extern const struct flashchip flashchips[];
|
||||||
|
extern const unsigned int flashchips_size;
|
||||||
|
|
||||||
void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr);
|
void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr);
|
||||||
void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr);
|
void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr);
|
||||||
|
@ -13424,5 +13424,7 @@ const struct flashchip flashchips[] = {
|
|||||||
.write = NULL,
|
.write = NULL,
|
||||||
},
|
},
|
||||||
|
|
||||||
{ NULL }
|
{0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const unsigned int flashchips_size = ARRAY_SIZE(flashchips);
|
||||||
|
57
flashrom.c
57
flashrom.c
@ -1269,10 +1269,7 @@ out_free:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function shares a lot of its structure with erase_and_write_flash() and
|
/* Even if an error is found, the function will keep going and check the rest. */
|
||||||
* walk_eraseregions().
|
|
||||||
* Even if an error is found, the function will keep going and check the rest.
|
|
||||||
*/
|
|
||||||
static int selfcheck_eraseblocks(const struct flashchip *chip)
|
static int selfcheck_eraseblocks(const struct flashchip *chip)
|
||||||
{
|
{
|
||||||
int i, j, k;
|
int i, j, k;
|
||||||
@ -1694,8 +1691,7 @@ void print_banner(void)
|
|||||||
|
|
||||||
int selfcheck(void)
|
int selfcheck(void)
|
||||||
{
|
{
|
||||||
const struct flashchip *chip;
|
unsigned int i;
|
||||||
int i;
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
/* Safety check. Instead of aborting after the first error, check
|
/* Safety check. Instead of aborting after the first error, check
|
||||||
@ -1748,37 +1744,32 @@ int selfcheck(void)
|
|||||||
ret = 1;
|
ret = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* It would be favorable if we could also check for correct termination
|
|
||||||
* of the following arrays, but we don't know their sizes in here...
|
/* It would be favorable if we could check for the correct layout (especially termination) of various
|
||||||
* For 'flashchips' we check the first element to be non-null. In the
|
* constant arrays: flashchips, chipset_enables, board_matches, boards_known, laptops_known.
|
||||||
* other cases there exist use cases where the first element can be
|
* They are all defined as externs in this compilation unit so we don't know their sizes which vary
|
||||||
* null. */
|
* depending on compiler flags, e.g. the target architecture, and can sometimes be 0.
|
||||||
if (flashchips == NULL || flashchips[0].vendor == NULL) {
|
* For 'flashchips' we export the size explicitly to work around this and to be able to implement the
|
||||||
|
* checks below. */
|
||||||
|
if (flashchips_size <= 1 || flashchips[flashchips_size-1].name != NULL) {
|
||||||
msg_gerr("Flashchips table miscompilation!\n");
|
msg_gerr("Flashchips table miscompilation!\n");
|
||||||
ret = 1;
|
ret = 1;
|
||||||
|
} else {
|
||||||
|
for (i = 0; i < flashchips_size - 1; i++) {
|
||||||
|
const struct flashchip *chip = &flashchips[i];
|
||||||
|
if (chip->vendor == NULL || chip->name == NULL || chip->bustype == BUS_NONE) {
|
||||||
|
ret = 1;
|
||||||
|
msg_gerr("ERROR: Some field of flash chip #%d (%s) is misconfigured.\n"
|
||||||
|
"Please report a bug at flashrom@flashrom.org\n", i,
|
||||||
|
chip->name == NULL ? "unnamed" : chip->name);
|
||||||
|
}
|
||||||
|
if (selfcheck_eraseblocks(chip)) {
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for (chip = flashchips; chip && chip->name; chip++)
|
|
||||||
if (selfcheck_eraseblocks(chip))
|
|
||||||
ret = 1;
|
|
||||||
|
|
||||||
#if CONFIG_INTERNAL == 1
|
/* TODO: implement similar sanity checks for other arrays where deemed necessary. */
|
||||||
if (chipset_enables == NULL) {
|
|
||||||
msg_gerr("Chipset enables table does not exist!\n");
|
|
||||||
ret = 1;
|
|
||||||
}
|
|
||||||
if (board_matches == NULL) {
|
|
||||||
msg_gerr("Board enables table does not exist!\n");
|
|
||||||
ret = 1;
|
|
||||||
}
|
|
||||||
if (boards_known == NULL) {
|
|
||||||
msg_gerr("Known boards table does not exist!\n");
|
|
||||||
ret = 1;
|
|
||||||
}
|
|
||||||
if (laptops_known == NULL) {
|
|
||||||
msg_gerr("Known laptops table does not exist!\n");
|
|
||||||
ret = 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user