Module Name: src Committed By: abs Date: Fri Jul 27 07:42:27 UTC 2012
Modified Files: src/sys/arch/dreamcast/dev: gdrom.c Log Message: - Adjust the TOC parsing to reject an TOC with invalid (zero) track ids. Avoids dereferencing off the start of the TOC track array. - Add #ifdef GDROMDEBUGTOC for dumping out the gdrom TOC values To generate a diff of this commit: cvs rdiff -u -r1.34 -r1.35 src/sys/arch/dreamcast/dev/gdrom.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/dreamcast/dev/gdrom.c diff -u src/sys/arch/dreamcast/dev/gdrom.c:1.34 src/sys/arch/dreamcast/dev/gdrom.c:1.35 --- src/sys/arch/dreamcast/dev/gdrom.c:1.34 Wed Sep 1 16:48:00 2010 +++ src/sys/arch/dreamcast/dev/gdrom.c Fri Jul 27 07:42:26 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: gdrom.c,v 1.34 2010/09/01 16:48:00 tsutsui Exp $ */ +/* $NetBSD: gdrom.c,v 1.35 2012/07/27 07:42:26 abs Exp $ */ /*- * Copyright (c) 2001 Marcus Comstedt @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: gdrom.c,v 1.34 2010/09/01 16:48:00 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gdrom.c,v 1.35 2012/07/27 07:42:26 abs Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -586,15 +586,35 @@ gdromioctl(dev_t dev, u_long cmd, void * if (error != 0) return error; - +#ifdef GDROMDEBUGTOC + { /* Dump the GDROM TOC */ + unsigned char *ptr = (unsigned char *)&toc; + int i; + + printf("gdrom: TOC\n"); + for(i = 0; i < sizeof(toc); ++i) { + printf("%02x", *ptr++); + if( i%32 == 31) + printf("\n"); + else if( i%4 == 3) + printf(","); + } + printf("\n"); + } +#endif for (track = TOC_TRACK(toc.last); track >= TOC_TRACK(toc.first); - --track) + --track) { + if (track < 1 || track > 100) + return ENXIO; if (TOC_CTRL(toc.entry[track - 1])) break; + } - if (track < TOC_TRACK(toc.first) || track > 100) - return ENXIO; +#ifdef GDROMDEBUGTOC + printf("gdrom: Using track %d, LBA %u\n", track, + TOC_LBA(toc.entry[track - 1])); +#endif *(int *)addr = htonl(TOC_LBA(toc.entry[track - 1])) - sc->openpart_start;