forked from luck/tmp_suning_uos_patched
nubus: Validate slot resource IDs
While we are here, include the slot number in the related error messages. Tested-by: Stan Johnson <userm57@yahoo.com> Signed-off-by: Finn Thain <fthain@telegraphics.com.au> Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
This commit is contained in:
parent
f53bad0881
commit
d7811a3678
|
@ -616,7 +616,8 @@ static int __init nubus_get_board_resource(struct nubus_board *board, int slot,
|
||||||
nbtdata[0], nbtdata[1], nbtdata[2], nbtdata[3]);
|
nbtdata[0], nbtdata[1], nbtdata[2], nbtdata[3]);
|
||||||
if (nbtdata[0] != 1 || nbtdata[1] != 0 ||
|
if (nbtdata[0] != 1 || nbtdata[1] != 0 ||
|
||||||
nbtdata[2] != 0 || nbtdata[3] != 0)
|
nbtdata[2] != 0 || nbtdata[3] != 0)
|
||||||
pr_err("this sResource is not a board resource!\n");
|
pr_err("Slot %X: sResource is not a board resource!\n",
|
||||||
|
slot);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NUBUS_RESID_NAME:
|
case NUBUS_RESID_NAME:
|
||||||
|
@ -672,6 +673,7 @@ static struct nubus_board * __init nubus_add_board(int slot, int bytelanes)
|
||||||
unsigned long dpat;
|
unsigned long dpat;
|
||||||
struct nubus_dir dir;
|
struct nubus_dir dir;
|
||||||
struct nubus_dirent ent;
|
struct nubus_dirent ent;
|
||||||
|
int prev_resid = -1;
|
||||||
|
|
||||||
/* Move to the start of the format block */
|
/* Move to the start of the format block */
|
||||||
rp = nubus_rom_addr(slot);
|
rp = nubus_rom_addr(slot);
|
||||||
|
@ -711,10 +713,10 @@ static struct nubus_board * __init nubus_add_board(int slot, int bytelanes)
|
||||||
|
|
||||||
/* Directory offset should be small and negative... */
|
/* Directory offset should be small and negative... */
|
||||||
if (!(board->doffset & 0x00FF0000))
|
if (!(board->doffset & 0x00FF0000))
|
||||||
pr_warn("Dodgy doffset!\n");
|
pr_warn("Slot %X: Dodgy doffset!\n", slot);
|
||||||
dpat = nubus_get_rom(&rp, 4, bytelanes);
|
dpat = nubus_get_rom(&rp, 4, bytelanes);
|
||||||
if (dpat != NUBUS_TEST_PATTERN)
|
if (dpat != NUBUS_TEST_PATTERN)
|
||||||
pr_warn("Wrong test pattern %08lx!\n", dpat);
|
pr_warn("Slot %X: Wrong test pattern %08lx!\n", slot, dpat);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* I wonder how the CRC is meant to work -
|
* I wonder how the CRC is meant to work -
|
||||||
|
@ -740,12 +742,15 @@ static struct nubus_board * __init nubus_add_board(int slot, int bytelanes)
|
||||||
for each of them. */
|
for each of them. */
|
||||||
if (nubus_readdir(&dir, &ent) == -1) {
|
if (nubus_readdir(&dir, &ent) == -1) {
|
||||||
/* We can't have this! */
|
/* We can't have this! */
|
||||||
pr_err("Board resource not found!\n");
|
pr_err("Slot %X: Board resource not found!\n", slot);
|
||||||
return NULL;
|
return NULL;
|
||||||
} else {
|
|
||||||
nubus_get_board_resource(board, slot, &ent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ent.type < 1 || ent.type > 127)
|
||||||
|
pr_warn("Slot %X: Board resource ID is invalid!\n", slot);
|
||||||
|
|
||||||
|
nubus_get_board_resource(board, slot, &ent);
|
||||||
|
|
||||||
while (nubus_readdir(&dir, &ent) != -1) {
|
while (nubus_readdir(&dir, &ent) != -1) {
|
||||||
struct nubus_dev *dev;
|
struct nubus_dev *dev;
|
||||||
struct nubus_dev **devp;
|
struct nubus_dev **devp;
|
||||||
|
@ -754,6 +759,15 @@ static struct nubus_board * __init nubus_add_board(int slot, int bytelanes)
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* Resources should appear in ascending ID order. This sanity
|
||||||
|
* check prevents duplicate resource IDs.
|
||||||
|
*/
|
||||||
|
if (dev->resid <= prev_resid) {
|
||||||
|
kfree(dev);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
prev_resid = dev->resid;
|
||||||
|
|
||||||
/* We zeroed this out above */
|
/* We zeroed this out above */
|
||||||
if (board->first_dev == NULL)
|
if (board->first_dev == NULL)
|
||||||
board->first_dev = dev;
|
board->first_dev = dev;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user