bincue: check catalog string for validity.

cdrdao: slightly more precise error messages for CATALOG.
This commit is contained in:
rocky
2004-07-09 20:48:05 +00:00
parent 771e9fb7cd
commit 3ee48c691c
2 changed files with 92 additions and 55 deletions

View File

@@ -1,5 +1,5 @@
/* /*
$Id: bincue.c,v 1.27 2004/07/09 10:12:15 rocky Exp $ $Id: bincue.c,v 1.28 2004/07/09 20:48:05 rocky Exp $
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
@@ -26,7 +26,7 @@
(*.cue). (*.cue).
*/ */
static const char _rcsid[] = "$Id: bincue.c,v 1.27 2004/07/09 10:12:15 rocky Exp $"; static const char _rcsid[] = "$Id: bincue.c,v 1.28 2004/07/09 20:48:05 rocky Exp $";
#include "cdio_assert.h" #include "cdio_assert.h"
#include "cdio_private.h" #include "cdio_private.h"
@@ -144,7 +144,9 @@ typedef struct {
bool have_cue; bool have_cue;
} _img_private_t; } _img_private_t;
#if 0
static bool _bincue_image_read_cue (_img_private_t *env); static bool _bincue_image_read_cue (_img_private_t *env);
#endif
static uint32_t _stat_size_bincue (void *user_data); static uint32_t _stat_size_bincue (void *user_data);
static bool parse_cuefile (_img_private_t *cd, const char *toc_name); static bool parse_cuefile (_img_private_t *cd, const char *toc_name);
@@ -446,8 +448,40 @@ parse_cuefile (_img_private_t *cd, const char *psz_cue_name)
/* CATALOG ddddddddddddd */ /* CATALOG ddddddddddddd */
} else if (0 == strcmp ("CATALOG", psz_keyword)) { } else if (0 == strcmp ("CATALOG", psz_keyword)) {
if (-1 == i) { if (-1 == i) {
if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) if (NULL == (psz_field = strtok (NULL, " \t\n\r"))) {
if (cd) cd->psz_mcn = strdup (psz_field); cdio_log(log_level,
"%s line %d after word CATALOG: ",
psz_cue_name, i_line);
cdio_log(log_level,
"expecting 13-digit media catalog number, got nothing.");
goto err_exit;
}
if (strlen(psz_field) != 13) {
cdio_log(log_level,
"%s line %d after word CATALOG: ",
psz_cue_name, i_line);
cdio_log(log_level,
"Token %s has length %ld. Should be 13 digits.",
psz_field, (long int) strlen(psz_field));
goto err_exit;
} else {
/* Check that we have all digits*/
unsigned int i;
for (i=0; i<13; i++) {
if (!isdigit(psz_field[i])) {
cdio_log(log_level,
"%s line %d after word CATALOG:",
psz_cue_name, i_line);
cdio_log(log_level,
"Character \"%c\" at postition %i of token \"%s\" "
"is not all digits.",
psz_field[i], i+1, psz_field);
goto err_exit;
}
}
}
if (cd) cd->psz_mcn = strdup (psz_field);
if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
goto format_error; goto format_error;
} }
@@ -756,7 +790,7 @@ parse_cuefile (_img_private_t *cd, const char *psz_cue_name)
} }
#if 0
static bool static bool
_bincue_image_read_cue (_img_private_t *env) _bincue_image_read_cue (_img_private_t *env)
{ {
@@ -916,6 +950,7 @@ _bincue_image_read_cue (_img_private_t *env)
fclose (fp); fclose (fp);
return true; return true;
} }
#endif
/*! /*!
Reads a single audio sector from CD device into data starting Reads a single audio sector from CD device into data starting

View File

@@ -1,5 +1,5 @@
/* /*
$Id: cdrdao.c,v 1.13 2004/07/09 10:27:17 rocky Exp $ $Id: cdrdao.c,v 1.14 2004/07/09 20:48:05 rocky Exp $
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
toc reading routine adapted from cuetools toc reading routine adapted from cuetools
@@ -29,7 +29,7 @@
# include "config.h" # include "config.h"
#endif #endif
static const char _rcsid[] = "$Id: cdrdao.c,v 1.13 2004/07/09 10:27:17 rocky Exp $"; static const char _rcsid[] = "$Id: cdrdao.c,v 1.14 2004/07/09 20:48:05 rocky Exp $";
#include "cdio_assert.h" #include "cdio_assert.h"
#include "cdio_private.h" #include "cdio_private.h"
@@ -378,7 +378,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
char line[MAXLINE]; char line[MAXLINE];
FILE *fp; FILE *fp;
unsigned int i_line=0; unsigned int i_line=0;
char *keyword, *field; char *keyword, *psz_field;
int i = -1; int i = -1;
cdio_log_level_t log_level = (NULL == cd) ? CDIO_LOG_INFO : CDIO_LOG_WARN; cdio_log_level_t log_level = (NULL == cd) ? CDIO_LOG_INFO : CDIO_LOG_WARN;
@@ -399,37 +399,39 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
/* strip comment from line */ /* strip comment from line */
/* todo: // in quoted strings? */ /* todo: // in quoted strings? */
/* //comment */ /* //comment */
if (NULL != (field = strstr (line, "//"))) if (NULL != (psz_field = strstr (line, "//")))
*field = '\0'; *psz_field = '\0';
if (NULL != (keyword = strtok (line, " \t\n\r"))) { if (NULL != (keyword = strtok (line, " \t\n\r"))) {
/* CATALOG "ddddddddddddd" */ /* CATALOG "ddddddddddddd" */
if (0 == strcmp ("CATALOG", keyword)) { if (0 == strcmp ("CATALOG", keyword)) {
if (-1 == i) { if (-1 == i) {
if (NULL != (field = strtok (NULL, "\"\t\n\r"))) { if (NULL != (psz_field = strtok (NULL, "\"\t\n\r"))) {
if (13 != strlen(field)) { if (13 != strlen(psz_field)) {
cdio_log(log_level, cdio_log(log_level,
"%s line %d after word CATALOG:", "%s line %d after word CATALOG:",
psz_toc_name, i_line); psz_toc_name, i_line);
cdio_log(log_level, cdio_log(log_level,
"Token %s has length %ld. Should be 13 digits.", "Token %s has length %ld. Should be 13 digits.",
field, (long int) strlen(field)); psz_field, (long int) strlen(psz_field));
goto err_exit; goto err_exit;
} else { } else {
/* Check that we have all digits*/ /* Check that we have all digits*/
unsigned int i; unsigned int i;
for (i=0; i<13; i++) { for (i=0; i<13; i++) {
if (!isdigit(field[i])) { if (!isdigit(psz_field[i])) {
cdio_log(log_level, cdio_log(log_level,
"%s line %d after word CATALOG:", "%s line %d after word CATALOG:",
psz_toc_name, i_line); psz_toc_name, i_line);
cdio_log(log_level, cdio_log(log_level,
"Token %s is not all digits.", field); "Character \"%c\" at postition %i of token \"%s\""
" is not all digits.",
psz_field[i], i+1, psz_field);
goto err_exit; goto err_exit;
} }
} }
if (NULL != cd) cd->psz_mcn = strdup (field); if (NULL != cd) cd->psz_mcn = strdup (psz_field);
} }
} else { } else {
cdio_log(log_level, cdio_log(log_level,
@@ -470,8 +472,8 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
} else if (0 == strcmp ("TRACK", keyword)) { } else if (0 == strcmp ("TRACK", keyword)) {
i++; i++;
/* cd->tocent[i].cdtext = NULL; */ /* cd->tocent[i].cdtext = NULL; */
if (NULL != (field = strtok (NULL, " \t\n\r"))) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
if (0 == strcmp ("AUDIO", field)) { if (0 == strcmp ("AUDIO", psz_field)) {
if (NULL != cd) { if (NULL != cd) {
cd->tocent[i].track_format = TRACK_FORMAT_AUDIO; cd->tocent[i].track_format = TRACK_FORMAT_AUDIO;
cd->tocent[i].blocksize = CDIO_CD_FRAMESIZE_RAW; cd->tocent[i].blocksize = CDIO_CD_FRAMESIZE_RAW;
@@ -479,7 +481,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
cd->tocent[i].datastart = 0; cd->tocent[i].datastart = 0;
cd->tocent[i].endsize = 0; cd->tocent[i].endsize = 0;
} }
} else if (0 == strcmp ("MODE1", field)) { } else if (0 == strcmp ("MODE1", psz_field)) {
if (NULL != cd) { if (NULL != cd) {
cd->tocent[i].track_format = TRACK_FORMAT_DATA; cd->tocent[i].track_format = TRACK_FORMAT_DATA;
cd->tocent[i].blocksize = CDIO_CD_FRAMESIZE_RAW; cd->tocent[i].blocksize = CDIO_CD_FRAMESIZE_RAW;
@@ -489,7 +491,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
cd->tocent[i].endsize = CDIO_CD_EDC_SIZE cd->tocent[i].endsize = CDIO_CD_EDC_SIZE
+ CDIO_CD_M1F1_ZERO_SIZE + CDIO_CD_ECC_SIZE; + CDIO_CD_M1F1_ZERO_SIZE + CDIO_CD_ECC_SIZE;
} }
} else if (0 == strcmp ("MODE1_RAW", field)) { } else if (0 == strcmp ("MODE1_RAW", psz_field)) {
if (NULL != cd) { if (NULL != cd) {
cd->tocent[i].track_format = TRACK_FORMAT_DATA; cd->tocent[i].track_format = TRACK_FORMAT_DATA;
cd->tocent[i].blocksize = CDIO_CD_FRAMESIZE_RAW; cd->tocent[i].blocksize = CDIO_CD_FRAMESIZE_RAW;
@@ -499,7 +501,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
cd->tocent[i].endsize = CDIO_CD_EDC_SIZE cd->tocent[i].endsize = CDIO_CD_EDC_SIZE
+ CDIO_CD_M1F1_ZERO_SIZE + CDIO_CD_ECC_SIZE; + CDIO_CD_M1F1_ZERO_SIZE + CDIO_CD_ECC_SIZE;
} }
} else if (0 == strcmp ("MODE2", field)) { } else if (0 == strcmp ("MODE2", psz_field)) {
if (NULL != cd) { if (NULL != cd) {
cd->tocent[i].track_format = TRACK_FORMAT_XA; cd->tocent[i].track_format = TRACK_FORMAT_XA;
cd->tocent[i].datastart = CDIO_CD_SYNC_SIZE cd->tocent[i].datastart = CDIO_CD_SYNC_SIZE
@@ -507,7 +509,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
cd->tocent[i].datasize = M2RAW_SECTOR_SIZE; cd->tocent[i].datasize = M2RAW_SECTOR_SIZE;
cd->tocent[i].endsize = 0; cd->tocent[i].endsize = 0;
} }
} else if (0 == strcmp ("MODE2_FORM1", field)) { } else if (0 == strcmp ("MODE2_FORM1", psz_field)) {
if (NULL != cd) { if (NULL != cd) {
cd->tocent[i].track_format = TRACK_FORMAT_XA; cd->tocent[i].track_format = TRACK_FORMAT_XA;
cd->tocent[i].datastart = CDIO_CD_SYNC_SIZE cd->tocent[i].datastart = CDIO_CD_SYNC_SIZE
@@ -515,7 +517,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
cd->tocent[i].datasize = CDIO_CD_FRAMESIZE_RAW; cd->tocent[i].datasize = CDIO_CD_FRAMESIZE_RAW;
cd->tocent[i].endsize = 0; cd->tocent[i].endsize = 0;
} }
} else if (0 == strcmp ("MODE2_FORM2", field)) { } else if (0 == strcmp ("MODE2_FORM2", psz_field)) {
if (NULL != cd) { if (NULL != cd) {
cd->tocent[i].track_format = TRACK_FORMAT_XA; cd->tocent[i].track_format = TRACK_FORMAT_XA;
cd->tocent[i].datastart = CDIO_CD_SYNC_SIZE cd->tocent[i].datastart = CDIO_CD_SYNC_SIZE
@@ -524,7 +526,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
cd->tocent[i].endsize = CDIO_CD_SYNC_SIZE cd->tocent[i].endsize = CDIO_CD_SYNC_SIZE
+ CDIO_CD_ECC_SIZE; + CDIO_CD_ECC_SIZE;
} }
} else if (0 == strcmp ("MODE2_FORM_MIX", field)) { } else if (0 == strcmp ("MODE2_FORM_MIX", psz_field)) {
if (NULL != cd) { if (NULL != cd) {
cd->tocent[i].track_format = TRACK_FORMAT_XA; cd->tocent[i].track_format = TRACK_FORMAT_XA;
cd->tocent[i].datasize = M2RAW_SECTOR_SIZE; cd->tocent[i].datasize = M2RAW_SECTOR_SIZE;
@@ -534,7 +536,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
cd->tocent[i].track_green = true; cd->tocent[i].track_green = true;
cd->tocent[i].endsize = 0; cd->tocent[i].endsize = 0;
} }
} else if (0 == strcmp ("MODE2_RAW", field)) { } else if (0 == strcmp ("MODE2_RAW", psz_field)) {
if (NULL != cd) { if (NULL != cd) {
cd->tocent[i].track_format = TRACK_FORMAT_XA; cd->tocent[i].track_format = TRACK_FORMAT_XA;
cd->tocent[i].blocksize = CDIO_CD_FRAMESIZE_RAW; cd->tocent[i].blocksize = CDIO_CD_FRAMESIZE_RAW;
@@ -547,30 +549,30 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
} else { } else {
cdio_log(log_level, "%s line %d after TRACK:", cdio_log(log_level, "%s line %d after TRACK:",
psz_toc_name, i_line); psz_toc_name, i_line);
cdio_log(log_level, "'%s' not a valid mode.", field); cdio_log(log_level, "'%s' not a valid mode.", psz_field);
goto err_exit; goto err_exit;
} }
} }
if (NULL != (field = strtok (NULL, " \t\n\r"))) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
/* todo: set sub-channel-mode */ /* todo: set sub-channel-mode */
if (0 == strcmp ("RW", field)) if (0 == strcmp ("RW", psz_field))
; ;
else if (0 == strcmp ("RW_RAW", field)) else if (0 == strcmp ("RW_RAW", psz_field))
; ;
} }
if (NULL != (field = strtok (NULL, " \t\n\r"))) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
goto format_error; goto format_error;
} }
/* track flags */ /* track flags */
/* [NO] COPY | [NO] PRE_EMPHASIS */ /* [NO] COPY | [NO] PRE_EMPHASIS */
} else if (0 == strcmp ("NO", keyword)) { } else if (0 == strcmp ("NO", keyword)) {
if (NULL != (field = strtok (NULL, " \t\n\r"))) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
if (0 == strcmp ("COPY", field)) { if (0 == strcmp ("COPY", psz_field)) {
if (NULL != cd) if (NULL != cd)
cd->tocent[i].flags &= ~CDIO_TRACK_FLAG_COPY_PERMITTED; cd->tocent[i].flags &= ~CDIO_TRACK_FLAG_COPY_PERMITTED;
} else if (0 == strcmp ("PRE_EMPHASIS", field)) } else if (0 == strcmp ("PRE_EMPHASIS", psz_field))
if (NULL != cd) { if (NULL != cd) {
cd->tocent[i].flags &= ~CDIO_TRACK_FLAG_PRE_EMPHASIS; cd->tocent[i].flags &= ~CDIO_TRACK_FLAG_PRE_EMPHASIS;
goto err_exit; goto err_exit;
@@ -578,7 +580,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
} else { } else {
goto format_error; goto format_error;
} }
if (NULL != (field = strtok (NULL, " \t\n\r"))) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
goto format_error; goto format_error;
} }
} else if (0 == strcmp ("COPY", keyword)) { } else if (0 == strcmp ("COPY", keyword)) {
@@ -598,9 +600,9 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
/* ISRC "CCOOOYYSSSSS" */ /* ISRC "CCOOOYYSSSSS" */
} else if (0 == strcmp ("ISRC", keyword)) { } else if (0 == strcmp ("ISRC", keyword)) {
if (NULL != (field = strtok (NULL, "\"\t\n\r"))) { if (NULL != (psz_field = strtok (NULL, "\"\t\n\r"))) {
if (NULL != cd) if (NULL != cd)
cd->tocent[i].isrc = strdup(field); cd->tocent[i].isrc = strdup(psz_field);
} else { } else {
goto format_error; goto format_error;
} }
@@ -617,23 +619,23 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
} else if (0 == strcmp ("FILE", keyword) } else if (0 == strcmp ("FILE", keyword)
|| 0 == strcmp ("AUDIOFILE", keyword)) { || 0 == strcmp ("AUDIOFILE", keyword)) {
if (0 <= i) { if (0 <= i) {
if (NULL != (field = strtok (NULL, "\"\t\n\r"))) { if (NULL != (psz_field = strtok (NULL, "\"\t\n\r"))) {
if (NULL != cd) { if (NULL != cd) {
cd->tocent[i].filename = strdup (field); cd->tocent[i].filename = strdup (psz_field);
/* Todo: do something about reusing existing files. */ /* Todo: do something about reusing existing files. */
if (!(cd->tocent[i].data_source = cdio_stdio_new (field))) { if (!(cd->tocent[i].data_source = cdio_stdio_new (psz_field))) {
cdio_warn ("%s line %d: can't open file `%s' for reading", cdio_warn ("%s line %d: can't open file `%s' for reading",
psz_toc_name, i_line, field); psz_toc_name, i_line, psz_field);
goto err_exit; goto err_exit;
} }
} }
} }
if (NULL != (field = strtok (NULL, " \t\n\r"))) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
lba_t lba = cdio_lsn_to_lba(msf_lba_from_mmssff (field)); lba_t lba = cdio_lsn_to_lba(msf_lba_from_mmssff (psz_field));
if (CDIO_INVALID_LBA == lba) { if (CDIO_INVALID_LBA == lba) {
cdio_log(log_level, "%s line %d: invalid MSF string %s", cdio_log(log_level, "%s line %d: invalid MSF string %s",
psz_toc_name, i_line, field); psz_toc_name, i_line, psz_field);
goto err_exit; goto err_exit;
} }
@@ -642,10 +644,10 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
cdio_lba_to_msf(lba, &(cd->tocent[i].start_msf)); cdio_lba_to_msf(lba, &(cd->tocent[i].start_msf));
} }
} }
if (NULL != (field = strtok (NULL, " \t\n\r"))) if (NULL != (psz_field = strtok (NULL, " \t\n\r")))
if (NULL != cd) if (NULL != cd)
cd->tocent[i].length = msf_lba_from_mmssff (field); cd->tocent[i].length = msf_lba_from_mmssff (psz_field);
if (NULL != (field = strtok (NULL, " \t\n\r"))) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
goto format_error; goto format_error;
} }
} else { } else {
@@ -663,16 +665,16 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
/* START MM:SS:FF */ /* START MM:SS:FF */
} else if (0 == strcmp ("START", keyword)) { } else if (0 == strcmp ("START", keyword)) {
if (0 <= i) { if (0 <= i) {
if (NULL != (field = strtok (NULL, " \t\n\r"))) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
/* todo: line is too long! */ /* todo: line is too long! */
if (NULL != cd) { if (NULL != cd) {
cd->tocent[i].start_lba += msf_lba_from_mmssff (field); cd->tocent[i].start_lba += msf_lba_from_mmssff (psz_field);
cdio_lba_to_msf(cd->tocent[i].start_lba, cdio_lba_to_msf(cd->tocent[i].start_lba,
&(cd->tocent[i].start_msf)); &(cd->tocent[i].start_msf));
} }
} }
if (NULL != (field = strtok (NULL, " \t\n\r"))) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
goto format_error; goto format_error;
} }
} else { } else {
@@ -682,13 +684,13 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
/* PREGAP MM:SS:FF */ /* PREGAP MM:SS:FF */
} else if (0 == strcmp ("PREGAP", keyword)) { } else if (0 == strcmp ("PREGAP", keyword)) {
if (0 <= i) { if (0 <= i) {
if (NULL != (field = strtok (NULL, " \t\n\r"))) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
if (NULL != cd) if (NULL != cd)
cd->tocent[i].pregap = msf_lba_from_mmssff (field); cd->tocent[i].pregap = msf_lba_from_mmssff (psz_field);
} else { } else {
goto format_error; goto format_error;
} }
if (NULL != (field = strtok (NULL, " \t\n\r"))) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
goto format_error; goto format_error;
} }
} else { } else {
@@ -698,7 +700,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
/* INDEX MM:SS:FF */ /* INDEX MM:SS:FF */
} else if (0 == strcmp ("INDEX", keyword)) { } else if (0 == strcmp ("INDEX", keyword)) {
if (0 <= i) { if (0 <= i) {
if (NULL != (field = strtok (NULL, " \t\n\r"))) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
if (NULL != cd) { if (NULL != cd) {
#if 0 #if 0
if (1 == cd->tocent[i].nindex) { if (1 == cd->tocent[i].nindex) {
@@ -706,7 +708,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
cd->tocent[i].nindex++; cd->tocent[i].nindex++;
} }
cd->tocent[i].indexes[cd->tocent[i].nindex++] = cd->tocent[i].indexes[cd->tocent[i].nindex++] =
msf_lba_from_mmssff (field) + cd->tocent[i].indexes[0]; msf_lba_from_mmssff (psz_field) + cd->tocent[i].indexes[0];
#else #else
; ;
@@ -715,7 +717,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_toc_name)
} else { } else {
goto format_error; goto format_error;
} }
if (NULL != (field = strtok (NULL, " \t\n\r"))) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
goto format_error; goto format_error;
} }
} else { } else {