diff options
author | 2005-12-23 16:18:19 +0000 | |
---|---|---|
committer | 2005-12-23 16:18:19 +0000 | |
commit | f4d6f03887552c15d73d14456f7623aca137bfd5 (patch) | |
tree | acbb231f88ff35bfc77d27af4b4316c9384fd431 | |
parent | set both ia_name and ia_compat (diff) | |
download | wireguard-openbsd-f4d6f03887552c15d73d14456f7623aca137bfd5.tar.xz wireguard-openbsd-f4d6f03887552c15d73d14456f7623aca137bfd5.zip |
Make cd_load_toc() take an address mode parameter, clean up a bit.
Add a check for ending_track < starting_track before calculating size
of TOC to read.
Tested by mjc@
-rw-r--r-- | sys/scsi/cd.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/sys/scsi/cd.c b/sys/scsi/cd.c index dcbb8621665..82e2e40fea3 100644 --- a/sys/scsi/cd.c +++ b/sys/scsi/cd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cd.c,v 1.99 2005/12/22 23:06:23 krw Exp $ */ +/* $OpenBSD: cd.c,v 1.100 2005/12/23 16:18:19 krw Exp $ */ /* $NetBSD: cd.c,v 1.100 1997/04/02 02:29:30 mycroft Exp $ */ /* @@ -135,7 +135,7 @@ int cd_read_subchannel(struct cd_softc *, int, int, int, struct cd_sub_channel_info *, int ); int cd_read_toc(struct cd_softc *, int, int, void *, int, int); int cd_get_parms(struct cd_softc *, int); -int cd_load_toc(struct cd_softc *, struct cd_toc *); +int cd_load_toc(struct cd_softc *, struct cd_toc *, int); int dvd_auth(struct cd_softc *, union dvd_authinfo *); int dvd_read_physical(struct cd_softc *, union dvd_struct *); @@ -1553,7 +1553,7 @@ cd_play_tracks(cd, strack, sindex, etrack, eindex) MALLOC(toc, struct cd_toc *, sizeof(struct cd_toc), M_TEMP, M_WAITOK); bzero(toc, sizeof(*toc)); - if ((error = cd_load_toc(cd, toc)) != 0) + if ((error = cd_load_toc(cd, toc, CD_MSF_FORMAT)) != 0) goto done; if (++etrack > (toc->header.ending_track+1)) @@ -1697,21 +1697,25 @@ cd_read_toc(cd, mode, start, data, len, control) } int -cd_load_toc(cd, toc) +cd_load_toc(cd, toc, fmt) struct cd_softc *cd; struct cd_toc *toc; + int fmt; { - int ntracks, len, error; + int n, len, error; - if ((error = cd_read_toc(cd, 0, 0, toc, sizeof(toc->header), 0)) != 0) - return (error); + error = cd_read_toc(cd, 0, 0, toc, sizeof(toc->header), 0); - ntracks = toc->header.ending_track - toc->header.starting_track + 1; - len = (ntracks + 1) * sizeof(struct cd_toc_entry) + - sizeof(toc->header); - if ((error = cd_read_toc(cd, CD_MSF_FORMAT, 0, toc, len, 0)) != 0) - return (error); - return (0); + if (error == 0) { + if (toc->header.ending_track < toc->header.starting_track) + return (EIO); + /* +2 to account for leading out track. */ + n = toc->header.ending_track - toc->header.starting_track + 2; + len = n * sizeof(struct cd_toc_entry) + sizeof(toc->header); + error = cd_read_toc(cd, fmt, 0, toc, len, 0); + } + + return (error); } |