--- a/src/drivers/cdrom/cd_nrg.c Thu Jun 10 22:13:16 2010 +1000 +++ b/src/drivers/cdrom/cd_nrg.c Sat Sep 17 22:39:36 2011 +1000 @@ -58,7 +58,7 @@ struct nrg_footer_v55 { uint32_t id; uint64_t offset; - } v55; + } __attribute__((packed)) v55; }; struct nrg_chunk { @@ -132,6 +132,7 @@ case 2: return SECTOR_MODE2_FORM1; case 3: return SECTOR_SEMIRAW_MODE2; case 7: return SECTOR_CDDA; + case 16: return SECTOR_CDDA_SUBCHANNEL; default: return -1; } } @@ -172,14 +173,18 @@ fseek( f, -12, SEEK_END ); fread( &footer, sizeof(footer), 1, f ); + uint32_t start = 0; if( GUINT32_FROM_BE(footer.v50.id) == NERO_V50_ID ) { - fseek( f, GUINT32_FROM_BE(footer.v50.offset), SEEK_SET ); + start = GUINT32_FROM_BE(footer.v50.offset); } else if( GUINT32_FROM_BE(footer.v55.id) == NERO_V55_ID ) { - fseek( f, (uint32_t)GUINT64_FROM_BE(footer.v55.offset), SEEK_SET ); + start = (uint32_t)GUINT64_FROM_BE(footer.v55.offset); } else { /* Not a (recognized) Nero image (should never happen) */ RETURN_PARSE_ERROR("File is not an NRG image" ); } + if( fseek( f, start, SEEK_SET) != 0 ) { + RETURN_PARSE_ERROR("File is not a valid NRG image" ); + } do { fread( &chunk, sizeof(chunk), 1, f );