Date: Tue, 7 Nov 2000 18:30:08 +0000 (GMT) From: George Reid <greid@ukug.uk.freebsd.org> To: FreeBSD-gnats-submit@freebsd.org Subject: kern/22664: [PATCH] mounting an audio CD causes kernel panic Message-ID: <Pine.BSF.4.21.0011071822110.356-100000@sobek.nevernet.net>
next in thread | raw e-mail | index | archive | help
>Number: 22664
>Category: kern
>Synopsis: [PATCH] mounting an audio CD causes kernel panic
>Confidential: no
>Severity: serious
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Tue Nov 07 10:30:01 PST 2000
>Closed-Date:
>Last-Modified:
>Originator: George Reid
>Release: FreeBSD 5.0-CURRENT i386
>Organization:
FreeBSD UK User Group
>Environment:
FreeBSD-5.0-CURRENT i386
>Description:
Wrongly trying to mount an audio CD causes a kernel panic. I discovered
this by when I tried to mount the wrong drive and lost a document I was
working on. Whoops.
The included patch adds a new ioctl, CDIOCGETMEDIUM to
/sys/dev/ata/atapi-cd.c (and /sys/sys/cdio.h) to retrieve the medium
information from the kernel. The patch to mount_cd9660.c adds support for
utilising this ioctl to check for people-who-do-bad-things-as-root.
>How-To-Repeat:
Try to mount an audio CD as if it were a data CD.
>Fix:
[PATCH 1: /sys/dev/ata/atapi-cd.c]
--- atapi-cd.c.orig Tue Nov 7 00:42:38 2000
+++ atapi-cd.c Tue Nov 7 18:12:10 2000
@@ -995,6 +995,14 @@
error = acd_setchan(cdp, CHANNEL_1, CHANNEL_1, 0, 0);
break;
+ case CDIOCGETMEDIUM:
+ {
+ struct ioc_medium *m = (struct ioc_medium *)addr;
+ m->data_length = cdp->cap.data_length;
+ m->medium_type = cdp->cap.medium_type;
+ }
+ break;
+
case CDRIOCBLANK:
error = acd_blank(cdp);
break;
[PATCH 2: /sys/sys/cdio.h]
--- cdio.h.orig Tue Nov 7 00:48:31 2000
+++ cdio.h Tue Nov 7 18:21:00 2000
@@ -283,4 +283,29 @@
#define CDIOCREADAUDIO _IOWR('c',31,struct ioc_read_audio)
+struct ioc_medium
+{
+ u_int16_t data_length;
+ u_int8_t medium_type;
+#define MST_TYPE_MASK_LOW 0x0f
+#define MST_FMT_NONE 0x00
+#define MST_DATA_120 0x01
+#define MST_AUDIO_120 0x02
+#define MST_COMB_120 0x03
+#define MST_PHOTO_120 0x04
+#define MST_DATA_80 0x05
+#define MST_AUDIO_80 0x06
+#define MST_COMB_80 0x07
+#define MST_PHOTO_80 0x08
+#define MST_TYPE_MASK_HIGH 0x70
+#define MST_CDROM 0x00
+#define MST_CDR 0x10
+#define MST_CDRW 0x20
+#define MST_NO_DISC 0x70
+#define MST_DOOR_OPEN 0x71
+#define MST_FMT_ERROR 0x72
+};
+
+#define CDIOCGETMEDIUM _IOWR('c',32,struct ioc_medium)
+
#endif /* !_SYS_CDIO_H_ */
[PATCH 3: /usr/src/sys/sbin/mount_cd9660/mount_cd9660.c]
--- mount_cd9660.c.orig Tue Nov 7 01:01:42 2000
+++ mount_cd9660.c Tue Nov 7 18:17:13 2000
@@ -145,6 +145,11 @@
args.export.ex_root = DEFAULT_ROOTUID;
args.flags = opts;
+ switch(is_medium_data(dev)) {
+ case -1: errx(EX_OSERR, "error reading medium type!");
+ case 0: errx(EX_DATAERR, "medium type is not data!");
+ }
+
if (args.ssector == -1) {
/*
* The start of the session has not been specified on
@@ -228,4 +233,28 @@
return -1;
return ntohl(toc_buffer[i].addr.lba);
+}
+
+int
+is_medium_data(const char *dev)
+{
+ struct ioc_medium m;
+ int fd;
+
+ if ((fd = open(dev, O_RDONLY)) == -1)
+ return -1;
+ if (ioctl(fd, CDIOCGETMEDIUM, &m) == -1) {
+ perror("ioctl");
+ close(fd);
+ return -1;
+ }
+ close(fd);
+ switch (m.medium_type & MST_TYPE_MASK_LOW)
+ {
+ case MST_DATA_120: return(1);
+ case MST_COMB_120: return(1);
+ case MST_DATA_80: return(1);
+ case MST_COMB_80: return(1);
+ }
+ return(0);
}
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0011071822110.356-100000>
