summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/driver/gnu_linux.c13
-rw-r--r--lib/driver/track.c60
2 files changed, 62 insertions, 11 deletions
diff --git a/lib/driver/gnu_linux.c b/lib/driver/gnu_linux.c
index d8b88533..6e4b050a 100644
--- a/lib/driver/gnu_linux.c
+++ b/lib/driver/gnu_linux.c
@@ -1,7 +1,7 @@
/*
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2011
- Rocky Bernstein <rocky@gnu.org>
+ 2012 Rocky Bernstein <rocky@gnu.org>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -601,7 +601,9 @@ get_track_msf_linux(void *p_user_data, track_t i_track, msf_t *msf)
{
_img_private_t *p_env = p_user_data;
- if (NULL == msf) return false;
+ if (NULL == msf ||
+ (i_track > CDIO_CD_MAX_TRACKS && i_track != CDIO_CDROM_LEADOUT_TRACK))
+ return false;
if (!p_env->gen.toc_init) read_toc_linux (p_user_data) ;
@@ -1179,6 +1181,13 @@ read_toc_linux (void *p_user_data)
p_env->gen.i_first_track = p_env->tochdr.cdth_trk0;
p_env->gen.i_tracks = p_env->tochdr.cdth_trk1;
+ if (p_env->gen.i_tracks > CDIO_CD_MAX_TRACKS) {
+ cdio_log(CDIO_LOG_WARN, "Number of tracks exceeds maximum (%d vs. %d)\n",
+ p_env->gen.i_tracks, CDIO_CD_MAX_TRACKS);
+ p_env->gen.i_tracks = CDIO_CD_MAX_TRACKS;
+ }
+
+
/* read individual tracks */
for (i= p_env->gen.i_first_track; i<=p_env->gen.i_tracks; i++) {
struct cdrom_tocentry *p_toc =
diff --git a/lib/driver/track.c b/lib/driver/track.c
index 31fd423f..da03d93f 100644
--- a/lib/driver/track.c
+++ b/lib/driver/track.c
@@ -1,5 +1,6 @@
/*
- Copyright (C) 2003, 2004, 2005, 2008, 2011 Rocky Bernstein <rocky@gnu.org>
+ Copyright (C) 2003, 2004, 2005, 2008, 2011, 2012
+ Rocky Bernstein <rocky@gnu.org>
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
This program is free software: you can redistribute it and/or modify
@@ -20,10 +21,10 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
-# define __CDIO_CONFIG_H__ 1
#endif
#include <cdio/cdio.h>
+#include <cdio/logging.h>
#include "cdio_private.h"
const char *track_format2str[6] =
@@ -39,9 +40,13 @@ enum cdio_track_enums;
CDIO_INVALID_TRACK is returned on error.
*/
track_t
-cdio_get_first_track_num (const CdIo_t *p_cdio)
+cdio_get_first_track_num(const CdIo_t *p_cdio)
{
- if (NULL == p_cdio) return CDIO_INVALID_TRACK;
+ if (NULL == p_cdio) {
+ cdio_info("Null CdIo object passed\n");
+ return CDIO_INVALID_TRACK;
+ }
+
if (p_cdio->op.get_first_track_num) {
return p_cdio->op.get_first_track_num (p_cdio->env);
@@ -57,7 +62,11 @@ cdio_get_first_track_num (const CdIo_t *p_cdio)
track_t
cdio_get_last_track_num (const CdIo_t *p_cdio)
{
- if (NULL == p_cdio) return CDIO_INVALID_TRACK;
+ if (NULL == p_cdio) {
+ cdio_info("Null CdIo object passed\n");
+ return CDIO_INVALID_TRACK;
+ }
+
{
const track_t i_first_track = cdio_get_first_track_num(p_cdio);
if ( CDIO_INVALID_TRACK != i_first_track ) {
@@ -76,6 +85,15 @@ cdio_get_last_track_num (const CdIo_t *p_cdio)
int
cdio_get_track_channels(const CdIo_t *p_cdio, track_t i_track)
{
+ if (NULL == p_cdio) {
+ cdio_info("Null CdIo object passed\n");
+ return -1;
+ }
+ if (i_track > CDIO_CD_MAX_TRACKS) {
+ cdio_log(CDIO_LOG_WARN, "Number of tracks exceeds maximum (%d vs. %d)\n",
+ i_track, CDIO_CD_MAX_TRACKS);
+ return -1;
+ }
if (p_cdio->op.get_track_channels) {
return p_cdio->op.get_track_channels (p_cdio->env, i_track);
} else {
@@ -209,7 +227,10 @@ cdio_get_track_green(const CdIo_t *p_cdio, track_t i_track)
lba_t
cdio_get_track_lba(const CdIo_t *p_cdio, track_t i_track)
{
- if (!p_cdio) return CDIO_INVALID_LBA;
+ if (NULL == p_cdio) {
+ cdio_info("Null CdIo object passed\n");
+ return CDIO_INVALID_LBA;
+ }
if (p_cdio->op.get_track_lba) {
return p_cdio->op.get_track_lba (p_cdio->env, i_track);
@@ -232,7 +253,16 @@ cdio_get_track_lba(const CdIo_t *p_cdio, track_t i_track)
lsn_t
cdio_get_track_lsn(const CdIo_t *p_cdio, track_t i_track)
{
- if (p_cdio == NULL) return CDIO_INVALID_LSN;
+ if (NULL == p_cdio) {
+ cdio_info("Null CdIo object passed\n");
+ return CDIO_INVALID_LSN;
+ }
+ if (i_track > CDIO_CD_MAX_TRACKS && i_track != CDIO_CDROM_LEADOUT_TRACK) {
+ cdio_log(CDIO_LOG_WARN, "Number of tracks exceeds maximum (%d vs. %d)\n",
+ i_track, CDIO_CD_MAX_TRACKS);
+ return CDIO_INVALID_LSN;
+ }
+
if (p_cdio->op.get_track_lba) {
return cdio_lba_to_lsn(p_cdio->op.get_track_lba (p_cdio->env, i_track));
@@ -254,7 +284,16 @@ cdio_get_track_lsn(const CdIo_t *p_cdio, track_t i_track)
char *
cdio_get_track_isrc (const CdIo_t *p_cdio, track_t i_track)
{
- if (p_cdio == NULL) return NULL;
+ if (NULL == p_cdio) {
+ cdio_info("Null CdIo object passed\n");
+ return NULL;
+ }
+
+ if (i_track > CDIO_CD_MAX_TRACKS) {
+ cdio_log(CDIO_LOG_WARN, "Number of tracks exceeds maximum (%d vs. %d)\n",
+ i_track, CDIO_CD_MAX_TRACKS);
+ return NULL;
+ }
if (p_cdio->op.get_track_isrc) {
return p_cdio->op.get_track_isrc (p_cdio->env, i_track);
@@ -271,7 +310,10 @@ cdio_get_track_isrc (const CdIo_t *p_cdio, track_t i_track)
lba_t
cdio_get_track_pregap_lba(const CdIo_t *p_cdio, track_t i_track)
{
- if (p_cdio == NULL) return CDIO_INVALID_LBA;
+ if (NULL == p_cdio) {
+ cdio_info("Null CdIo object passed\n");
+ return CDIO_INVALID_LBA;
+ }
if (p_cdio->op.get_track_pregap_lba) {
return p_cdio->op.get_track_pregap_lba (p_cdio->env, i_track);