diff options
author | 2013-01-06 12:37:35 +0000 | |
---|---|---|
committer | 2013-01-06 12:37:35 +0000 | |
commit | 7984ce0fab5647a7a469479053d11f66d6dda307 (patch) | |
tree | 7a19866355eaa3db9fd8353c57c91b55039a8321 /src | |
parent | 4ed1e62460301634ef4527980160947938fc11e9 (diff) |
improved error reporting of parse_wav_sample() and fixed potential resource leaks / use more proper errorcodes when encountering an error when parsing an input file (nw)
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/util/chdcd.c | 85 |
1 files changed, 61 insertions, 24 deletions
diff --git a/src/lib/util/chdcd.c b/src/lib/util/chdcd.c index 6ecc8e6186d..6fee45216d2 100644 --- a/src/lib/util/chdcd.c +++ b/src/lib/util/chdcd.c @@ -154,7 +154,7 @@ static UINT32 parse_wav_sample(const char *filename, UINT32 *dataoffs) filerr = osd_open(filename, OPEN_FLAG_READ, &file, &fsize); if (filerr != FILERR_NONE) { - osd_close(file); + printf("ERROR: could not open (%s)\n", filename); return 0; } @@ -162,24 +162,44 @@ static UINT32 parse_wav_sample(const char *filename, UINT32 *dataoffs) osd_read(file, buf, 0, 4, &actual); offset += actual; if (offset < 4) + { + osd_close(file); + printf("ERROR: unexpected offset %d (%s)\n", actual, filename); return 0; + } if (memcmp(&buf[0], "RIFF", 4) != 0) + { + osd_close(file); + printf("ERROR: could not find RIFF header (%s)\n", filename); return 0; + } /* get the total size */ osd_read(file, &filesize, offset, 4, &actual); offset += actual; if (offset < 8) + { + osd_close(file); + printf("ERROR: unexpected offset %d (%s)\n", actual, filename); return 0; + } filesize = LITTLE_ENDIANIZE_INT32(filesize); /* read the RIFF file type and make sure it's a WAVE file */ osd_read(file, buf, offset, 4, &actual); offset += actual; if (offset < 12) + { + osd_close(file); + printf("ERROR: unexpected offset %d (%s)\n", actual, filename); return 0; + } if (memcmp(&buf[0], "WAVE", 4) != 0) + { + osd_close(file); + printf("ERROR:could not find WAVE header (%s)\n", filename); return 0; + } /* seek until we find a format tag */ while (1) @@ -195,7 +215,11 @@ static UINT32 parse_wav_sample(const char *filename, UINT32 *dataoffs) /* seek to the next block */ offset += length; if (offset >= filesize) + { + osd_close(file); + printf("ERROR:could not find fmt tag (%s)\n", filename); return 0; + } } /* read the format -- make sure it is PCM */ @@ -203,21 +227,33 @@ static UINT32 parse_wav_sample(const char *filename, UINT32 *dataoffs) offset += actual; temp16 = LITTLE_ENDIANIZE_INT16(temp16); if (temp16 != 1) + { + osd_close(file); + printf("ERROR: unsupported format %d - only PCM is supported (%s)\n", temp16, filename); return 0; + } /* number of channels -- only mono is supported */ osd_read(file, &temp16, offset, 2, &actual); offset += actual; temp16 = LITTLE_ENDIANIZE_INT16(temp16); if (temp16 != 2) + { + osd_close(file); + printf("ERROR: unsupported number of channels %d - only mono is supported (%s)\n", temp16, filename); return 0; + } /* sample rate */ osd_read(file, &rate, offset, 4, &actual); offset += actual; rate = LITTLE_ENDIANIZE_INT32(rate); if (rate != 44100) + { + osd_close(file); + printf("ERROR: unsupported samplerate %d - only 44100 is supported (%s)\n", rate, filename); return 0; + } /* bytes/second and block alignment are ignored */ osd_read(file, buf, offset, 6, &actual); @@ -227,7 +263,11 @@ static UINT32 parse_wav_sample(const char *filename, UINT32 *dataoffs) osd_read(file, &bits, offset, 2, &actual); offset += actual; if (bits != 16) + { + osd_close(file); + printf("ERROR: unsupported bits/sample %d - only 16 is supported (%s)\n", bits, filename); return 0; + } /* seek past any extra data */ offset += length - 16; @@ -246,15 +286,19 @@ static UINT32 parse_wav_sample(const char *filename, UINT32 *dataoffs) /* seek to the next block */ offset += length; if (offset >= filesize) + { + osd_close(file); + printf("ERROR: could not find data tag (%s)\n", filename); return 0; + } } + osd_close(file); + /* if there was a 0 length data block, we're done */ if (length == 0) return 0; - osd_close(file); - *dataoffs = offset; return length; @@ -333,7 +377,7 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_ { printf("ERROR: Not a Nero 5.5 or later image!\n"); fclose(infile); - return CHDERR_FILE_NOT_FOUND; + return CHDERR_UNSUPPORTED_VERSION; } chain_offs = buffer[11] | (buffer[10]<<8) | (buffer[9]<<16) | (buffer[8]<<24); @@ -342,7 +386,7 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_ { printf("ERROR: File size is > 4GB, this version of CHDMAN cannot handle it."); fclose(infile); - return CHDERR_FILE_NOT_FOUND; + return CHDERR_UNSUPPORTED_FORMAT; } // printf("NER5 detected, chain offset: %x\n", chain_offs); @@ -403,12 +447,12 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_ case 0x0300: // Mode 2 Form 1 printf("ERROR: Mode 2 Form 1 tracks not supported\n"); fclose(infile); - return CHDERR_NOT_SUPPORTED; + return CHDERR_UNSUPPORTED_FORMAT; case 0x0500: // raw data printf("ERROR: Raw data tracks not supported\n"); fclose(infile); - return CHDERR_NOT_SUPPORTED; + return CHDERR_UNSUPPORTED_FORMAT; case 0x0600: // 2352 byte mode 2 raw outtoc.tracks[track-1].trktype = CD_TRACK_MODE2_RAW; @@ -423,22 +467,22 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_ case 0x0f00: // raw data with sub-channel printf("ERROR: Raw data tracks with sub-channel not supported\n"); fclose(infile); - return CHDERR_NOT_SUPPORTED; + return CHDERR_UNSUPPORTED_FORMAT; case 0x1000: // audio with sub-channel printf("ERROR: Audio tracks with sub-channel not supported\n"); fclose(infile); - return CHDERR_NOT_SUPPORTED; + return CHDERR_UNSUPPORTED_FORMAT; case 0x1100: // raw Mode 2 Form 1 with sub-channel printf("ERROR: Raw Mode 2 Form 1 tracks with sub-channel not supported\n"); fclose(infile); - return CHDERR_NOT_SUPPORTED; + return CHDERR_UNSUPPORTED_FORMAT; default: printf("ERROR: Unknown track type %x, contact MAMEDEV!\n", mode); fclose(infile); - return CHDERR_NOT_SUPPORTED; + return CHDERR_UNSUPPORTED_FORMAT; } outtoc.tracks[track-1].datasize = size; @@ -520,7 +564,7 @@ chd_error chdcd_parse_iso(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i outinfo.track[0].swap = false; } else { printf("ERROR: Unrecognized track type\n"); - return CHDERR_FILE_NOT_FOUND; + return CHDERR_UNSUPPORTED_FORMAT; } outtoc.tracks[0].subtype = CD_SUB_NONE; @@ -720,21 +764,14 @@ chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i wavlen = parse_wav_sample(lastfname, &wavoffs); if (!wavlen) { - file_error err; - core_file *fhand; - - err = core_fopen(lastfname, OPEN_FLAG_READ, &fhand); - if (err != FILERR_NONE) printf("holy moley!\n"); - else core_fclose(fhand); - printf("ERROR: couldn't read [%s] or not a valid .WAV\n", lastfname.cstr()); - return CHDERR_FILE_NOT_FOUND; + return CHDERR_INVALID_DATA; } } else { printf("ERROR: Unhandled track type %s\n", token); - return CHDERR_FILE_NOT_FOUND; + return CHDERR_UNSUPPORTED_FORMAT; } } else if (!strcmp(token, "TRACK")) @@ -774,7 +811,7 @@ chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i if (outtoc.tracks[trknum].datasize == 0) { printf("ERROR: Unknown track type [%s]. Contact MAMEDEV.\n", token); - return CHDERR_FILE_NOT_FOUND; + return CHDERR_UNSUPPORTED_FORMAT; } /* next (optional) token on the line is the subcode type */ @@ -897,7 +934,7 @@ chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i if (!outtoc.tracks[trknum].frames) { printf("ERROR: unable to determine size of track %d, missing INDEX 01 markers?\n", trknum+1); - return CHDERR_FILE_NOT_FOUND; + return CHDERR_INVALID_DATA; } } else /* data files are different */ @@ -1079,7 +1116,7 @@ chd_error chdcd_parse_toc(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i if (outtoc.tracks[trknum].datasize == 0) { printf("ERROR: Unknown track type [%s]. Contact MAMEDEV.\n", token); - return CHDERR_FILE_NOT_FOUND; + return CHDERR_UNSUPPORTED_FORMAT; } /* next (optional) token on the line is the subcode type */ |