diff --git a/cli/dsdiff.c b/cli/dsdiff.c index 410dc1c..a592fdc 100644 --- a/cli/dsdiff.c +++ b/cli/dsdiff.c @@ -170,8 +170,8 @@ int ParseDsdiffHeaderConfig (FILE *infile, char *infilename, char *fourcc, Wavpa if (!strncmp (prop_chunk, "SND ", 4)) { char *cptr = prop_chunk + 4, *eptr = prop_chunk + dff_chunk_header.ckDataSize; - uint16_t numChannels, chansSpecified, chanMask = 0; - uint32_t sampleRate; + uint16_t numChannels = 0, chansSpecified, chanMask = 0; + uint32_t sampleRate = 0; while (eptr - cptr >= sizeof (dff_chunk_header)) { memcpy (&dff_chunk_header, cptr, sizeof (dff_chunk_header)); @@ -194,6 +194,12 @@ int ParseDsdiffHeaderConfig (FILE *infile, char *infilename, char *fourcc, Wavpa chansSpecified = (int)(dff_chunk_header.ckDataSize - sizeof (numChannels)) / 4; + if (numChannels < chansSpecified || numChannels < 1 || numChannels > 256) { + error_line ("%s is not a valid .DFF file!", infilename); + free (prop_chunk); + return WAVPACK_SOFT_ERROR; + } + while (chansSpecified--) { if (!strncmp (cptr, "SLFT", 4) || !strncmp (cptr, "MLFT", 4)) chanMask |= 0x1; @@ -263,6 +269,10 @@ int ParseDsdiffHeaderConfig (FILE *infile, char *infilename, char *fourcc, Wavpa free (prop_chunk); } else if (!strncmp (dff_chunk_header.ckID, "DSD ", 4)) { + if (!config->num_channels || !config->sample_rate) { + error_line ("%s is not a valid .DFF file!", infilename); + return WAVPACK_SOFT_ERROR; + } total_samples = dff_chunk_header.ckDataSize / config->num_channels; break; }