Prevent kernel crashes caused by umass devices that return bogus mode sense
data, such as the "Cooler Master". From Rhialto. While there, clean up some debugging code and make the offset unsigned.
This commit is contained in:
parent
d048649c18
commit
409998ac55
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: sd.c,v 1.257 2006/11/29 21:06:49 drochner Exp $ */
|
||||
/* $NetBSD: sd.c,v 1.258 2006/11/30 17:59:35 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1998, 2003, 2004 The NetBSD Foundation, Inc.
|
||||
@ -54,7 +54,7 @@
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.257 2006/11/29 21:06:49 drochner Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.258 2006/11/30 17:59:35 christos Exp $");
|
||||
|
||||
#include "opt_scsi.h"
|
||||
#include "rnd.h"
|
||||
@ -1887,12 +1887,9 @@ sd_get_parms_page4(struct sd_softc *sd, struct disk_parms *dp, int flags)
|
||||
{
|
||||
struct sd_mode_sense_data scsipi_sense;
|
||||
int error;
|
||||
int big, poffset, byte2;
|
||||
int big, byte2;
|
||||
size_t poffset;
|
||||
union scsi_disk_pages *pages;
|
||||
#if 0
|
||||
int i;
|
||||
u_int8_t *p;
|
||||
#endif
|
||||
|
||||
byte2 = SMS_DBD;
|
||||
again:
|
||||
@ -1918,10 +1915,23 @@ again:
|
||||
poffset += scsipi_sense.header.small.blk_desc_len;
|
||||
}
|
||||
|
||||
if (poffset > sizeof(scsipi_sense) - sizeof(pages->rigid_geometry))
|
||||
return ERESTART;
|
||||
|
||||
pages = (void *)((u_long)&scsipi_sense + poffset);
|
||||
#if 0
|
||||
printf("page 4 sense:"); for (i = sizeof(scsipi_sense), p = (void *)&scsipi_sense; i; i--, p++) printf(" %02x", *p); printf("\n");
|
||||
printf("page 4 pg_code=%d sense=%p/%p\n", pages->rigid_geometry.pg_code, &scsipi_sense, pages);
|
||||
{
|
||||
size_t i;
|
||||
u_int8_t *p;
|
||||
|
||||
printf("page 4 sense:");
|
||||
for (i = sizeof(scsipi_sense), p = (void *)&scsipi_sense; i;
|
||||
i--, p++)
|
||||
printf(" %02x", *p);
|
||||
printf("\n");
|
||||
printf("page 4 pg_code=%d sense=%p/%p\n",
|
||||
pages->rigid_geometry.pg_code, &scsipi_sense, pages);
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((pages->rigid_geometry.pg_code & PGCODE_MASK) != 4)
|
||||
@ -1962,12 +1972,9 @@ sd_get_parms_page5(struct sd_softc *sd, struct disk_parms *dp, int flags)
|
||||
{
|
||||
struct sd_mode_sense_data scsipi_sense;
|
||||
int error;
|
||||
int big, poffset, byte2;
|
||||
int big, byte2;
|
||||
size_t poffset;
|
||||
union scsi_disk_pages *pages;
|
||||
#if 0
|
||||
int i;
|
||||
u_int8_t *p;
|
||||
#endif
|
||||
|
||||
byte2 = SMS_DBD;
|
||||
again:
|
||||
@ -1993,10 +2000,23 @@ again:
|
||||
poffset += scsipi_sense.header.small.blk_desc_len;
|
||||
}
|
||||
|
||||
if (poffset > sizeof(scsipi_sense) - sizeof(pages->flex_geometry))
|
||||
return ERESTART;
|
||||
|
||||
pages = (void *)((u_long)&scsipi_sense + poffset);
|
||||
#if 0
|
||||
printf("page 5 sense:"); for (i = sizeof(scsipi_sense), p = (void *)&scsipi_sense; i; i--, p++) printf(" %02x", *p); printf("\n");
|
||||
printf("page 5 pg_code=%d sense=%p/%p\n", pages->flex_geometry.pg_code, &scsipi_sense, pages);
|
||||
{
|
||||
size_t i;
|
||||
u_int8_t *p;
|
||||
|
||||
printf("page 5 sense:");
|
||||
for (i = sizeof(scsipi_sense), p = (void *)&scsipi_sense; i;
|
||||
i--, p++)
|
||||
printf(" %02x", *p);
|
||||
printf("\n");
|
||||
printf("page 5 pg_code=%d sense=%p/%p\n",
|
||||
pages->flex_geometry.pg_code, &scsipi_sense, pages);
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((pages->flex_geometry.pg_code & PGCODE_MASK) != 5)
|
||||
|
Loading…
x
Reference in New Issue
Block a user