summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdd Barrett <vext01@gmail.com>2018-12-01 18:01:57 +0000
committerEdd Barrett <vext01@gmail.com>2018-12-16 16:47:07 +0000
commit6a129e460c25d7ba6362983b337085a46ba0fa50 (patch)
treed0419963ee5797564f70febe952ce13fe637baf6
parentd23d371d1bdbb327be38f767fe579afe2492b83a (diff)
downloadlibcdio-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.c42
-rw-r--r--src/cd-info.c2
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