summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorConstantine Sapuntzakis <csapuntz@cvs.openbsd.org>1998-07-13 00:21:17 +0000
committerConstantine Sapuntzakis <csapuntz@cvs.openbsd.org>1998-07-13 00:21:17 +0000
commit3b4cf5a4420a77937126a0314b2820129963e041 (patch)
tree7f36cefd11592f4f84f644d5c2f59bc02c834295 /sys
parentf7df94f21c356f1cb927335f48be56fb9845b6f1 (diff)
CDs can have up to 99 tracks, not 65 tracks. Use kernel heap instead of stack
for temporary storage of CD table of contents
Diffstat (limited to 'sys')
-rw-r--r--sys/scsi/cd.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/sys/scsi/cd.c b/sys/scsi/cd.c
index cb8372ce589..81134c93de9 100644
--- a/sys/scsi/cd.c
+++ b/sys/scsi/cd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cd.c,v 1.31 1998/07/12 01:20:18 deraadt Exp $ */
+/* $OpenBSD: cd.c,v 1.32 1998/07/13 00:21:16 csapuntz Exp $ */
/* $NetBSD: cd.c,v 1.100 1997/04/02 02:29:30 mycroft Exp $ */
/*
@@ -825,26 +825,36 @@ cdioctl(dev, cmd, addr, flag, p)
case CDIOREADTOCENTRYS: {
struct cd_toc {
struct ioc_toc_header header;
- struct cd_toc_entry entries[65];
- } data;
+ struct cd_toc_entry entries[100];
+ } * data;
struct ioc_read_toc_entry *te =
(struct ioc_read_toc_entry *)addr;
struct ioc_toc_header *th;
int len = te->data_len;
- th = &data.header;
+ int res;
- if (len > sizeof(data.entries) ||
+ if (len > sizeof(data->entries) ||
len < sizeof(struct cd_toc_entry))
return EINVAL;
+
+ MALLOC (data, struct cd_toc *, sizeof (struct cd_toc),
+ M_DEVBUF, M_WAITOK);
+
+ th = &data->header;
+
error = cd_read_toc(cd, te->address_format,
te->starting_track,
- (struct cd_toc_entry *)&data,
+ (struct cd_toc_entry *)data,
len + sizeof(struct ioc_toc_header));
- if (error)
+ if (error) {
+ FREE(data, M_DEVBUF);
return error;
+ }
len = min(len, ntohs(th->len) - (sizeof(th->starting_track) +
sizeof(th->ending_track)));
- return copyout(data.entries, te->data, len);
+ res = copyout(data->entries, te->data, len);
+ FREE(data, M_DEVBUF);
+ return (res);
}
case CDIOCSETPATCH: {
struct ioc_patch *arg = (struct ioc_patch *)addr;