Skip to content

Commit

Permalink
[TG3]: Fix array overrun in tg3_read_partno().
Browse files Browse the repository at this point in the history
Use proper upper limits for the loops and check for all error
conditions.

The problem was noticed by Adrian Bunk.

Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Michael Chan authored and David S. Miller committed Nov 7, 2006
1 parent 25f484a commit af2c6a4
Showing 1 changed file with 12 additions and 7 deletions.
19 changes: 12 additions & 7 deletions drivers/net/tg3.c
Original file line number Diff line number Diff line change
Expand Up @@ -10212,7 +10212,7 @@ static int __devinit tg3_phy_probe(struct tg3 *tp)
static void __devinit tg3_read_partno(struct tg3 *tp)
{
unsigned char vpd_data[256];
int i;
unsigned int i;
u32 magic;

if (tg3_nvram_read_swab(tp, 0x0, &magic))
Expand Down Expand Up @@ -10258,9 +10258,9 @@ static void __devinit tg3_read_partno(struct tg3 *tp)
}

/* Now parse and find the part number. */
for (i = 0; i < 256; ) {
for (i = 0; i < 254; ) {
unsigned char val = vpd_data[i];
int block_end;
unsigned int block_end;

if (val == 0x82 || val == 0x91) {
i = (i + 3 +
Expand All @@ -10276,21 +10276,26 @@ static void __devinit tg3_read_partno(struct tg3 *tp)
(vpd_data[i + 1] +
(vpd_data[i + 2] << 8)));
i += 3;
while (i < block_end) {

if (block_end > 256)
goto out_not_found;

while (i < (block_end - 2)) {
if (vpd_data[i + 0] == 'P' &&
vpd_data[i + 1] == 'N') {
int partno_len = vpd_data[i + 2];

if (partno_len > 24)
i += 3;
if (partno_len > 24 || (partno_len + i) > 256)
goto out_not_found;

memcpy(tp->board_part_number,
&vpd_data[i + 3],
partno_len);
&vpd_data[i], partno_len);

/* Success. */
return;
}
i += 3 + vpd_data[i + 2];
}

/* Part number not found. */
Expand Down

0 comments on commit af2c6a4

Please sign in to comment.