diff options
| author | Edd Barrett <vext01@gmail.com> | 2018-12-01 18:01:57 +0000 |
|---|---|---|
| committer | Edd Barrett <vext01@gmail.com> | 2018-12-16 16:47:07 +0000 |
| commit | 6a129e460c25d7ba6362983b337085a46ba0fa50 (patch) | |
| tree | d0419963ee5797564f70febe952ce13fe637baf6 | |
| parent | d23d371d1bdbb327be38f767fe579afe2492b83a (diff) | |
| download | libcdio-6a129e460c25d7ba6362983b337085a46ba0fa50.tar.gz | |
NetBSD/OpenBSD: Do not assume the first track number is 1.
Found by Thomas Schmitt:
http://lists.gnu.org/archive/html/libcdio-devel/2018-10/msg00025.html
| -rw-r--r-- | lib/driver/netbsd.c | 42 | ||||
| -rw-r--r-- | src/cd-info.c | 2 |
2 files changed, 28 insertions, 16 deletions
diff --git a/lib/driver/netbsd.c b/lib/driver/netbsd.c index 35d314b..034dbf9 100644 --- a/lib/driver/netbsd.c +++ b/lib/driver/netbsd.c @@ -569,7 +569,7 @@ static track_format_t get_track_format_netbsd(void *user_data, track_t track_num) { _img_private_t *_obj = user_data; - int res; + int res, first_track = 0, track_idx = 0; if (!_obj->toc_valid) { res = _cdio_read_toc(_obj); @@ -577,19 +577,25 @@ get_track_format_netbsd(void *user_data, track_t track_num) return TRACK_FORMAT_ERROR; } - if (track_num > TOTAL_TRACKS || track_num == 0) - return TRACK_FORMAT_ERROR; + first_track = _obj->gen.i_first_track; + + if (!_obj->gen.toc_init || + track_num > (first_track + _obj->gen.i_tracks) || + track_num < first_track) + return (CDIO_INVALID_TRACK); - if (_obj->tocent[track_num - 1].control & 0x04) { + track_idx = track_num - first_track; + + if (_obj->tocent[track_idx].control & 0x04) { if (!_obj->sessionformat_valid) { res = _cdio_read_discinfo(_obj); if (res) return TRACK_FORMAT_ERROR; } - if (_obj->sessionformat[track_num - 1] == 0x10) + if (_obj->sessionformat[track_idx] == 0x10) return TRACK_FORMAT_CDI; - else if (_obj->sessionformat[track_num - 1] == 0x20) + else if (_obj->sessionformat[track_idx] == 0x20) return TRACK_FORMAT_XA; else return TRACK_FORMAT_DATA; @@ -618,15 +624,16 @@ get_track_green_netbsd(void *user_data, track_t track_num) track_num in obj. Track numbers usually start at something greater than 0, usually 1. - The "leadout" track is specified either by - using i_track LEADOUT_TRACK or the total tracks+1. + The "leadout" track is specified by passing i_track as either + LEADOUT_TRACK or the track number of the last audio track plus one. + False is returned if there is no track entry. */ static bool get_track_msf_netbsd(void *user_data, track_t track_num, msf_t *msf) { _img_private_t *_obj = user_data; - int res; + int res, first_track = 0, track_idx = 0; if (!msf) return false; @@ -638,14 +645,19 @@ get_track_msf_netbsd(void *user_data, track_t track_num, msf_t *msf) } if (track_num == CDIO_CDROM_LEADOUT_TRACK) - track_num = TOTAL_TRACKS + 1; + track_num = _obj->gen.i_tracks + _obj->gen.i_first_track; - if (track_num > TOTAL_TRACKS + 1 || track_num == 0) - return false; + first_track = _obj->gen.i_first_track; + + if (!_obj->gen.toc_init || + track_num > (first_track + _obj->gen.i_tracks) || + track_num < first_track) + return (CDIO_INVALID_TRACK); - msf->m = cdio_to_bcd8(_obj->tocent[track_num - 1].addr.msf.minute); - msf->s = cdio_to_bcd8(_obj->tocent[track_num - 1].addr.msf.second); - msf->f = cdio_to_bcd8(_obj->tocent[track_num - 1].addr.msf.frame); + track_idx = track_num - first_track; + msf->m = cdio_to_bcd8(_obj->tocent[track_idx].addr.msf.minute); + msf->s = cdio_to_bcd8(_obj->tocent[track_idx].addr.msf.second); + msf->f = cdio_to_bcd8(_obj->tocent[track_idx].addr.msf.frame); return true; } diff --git a/src/cd-info.c b/src/cd-info.c index aafe662..36537b4 100644 --- a/src/cd-info.c +++ b/src/cd-info.c @@ -971,7 +971,7 @@ main(int argc, char *argv[]) if (!opts.no_tracks) { printf("CD-ROM Track List (%i - %i)\n" NORMAL, - i_first_track, i_tracks); + i_first_track, i_first_track + i_tracks - 1); printf(" #: MSF LSN Type Green? Copy?"); if ( CDIO_DISC_MODE_CD_DA == discmode |
