Make wav parser less strict about allowed chunk types

This commit is contained in:
rakiru 2016-06-29 23:36:55 +01:00
parent 7065730447
commit 70e93e1cc0

View File

@ -371,32 +371,29 @@ wav_t *wav_parse(char *buf, int len)
} }
// now attempt to load data // now attempt to load data
uint32_t factlen = 0; uint32_t last_chunk_len = 0;
char *next_chunk = buf + 20 + fmtlen; char *next_chunk = buf + 20 + fmtlen;
while (1) {
// Check there's enough data for the chunk header
if (next_chunk + 8 > end || next_chunk + 8 < buf) { if (next_chunk + 8 > end || next_chunk + 8 < buf) {
fprintf(stderr, "wav_parse: file too short\n"); fprintf(stderr, "wav_parse: file too short\n");
return NULL; return NULL;
} }
if(!memcmp(next_chunk, "fact", 4))
{ // Check if chunk is one we want
// skip this crap if (!memcmp(next_chunk, "data", 4)) {
factlen = *(uint32_t *)(next_chunk + 4); break;
factlen += 8;
} }
next_chunk = buf + 20 + factlen + fmtlen; // Skip unwanted chunk
if (next_chunk + 8 > end || next_chunk + 8 < buf) { printf("wav_parse: skipping \"%.4s\" chunk\n", next_chunk);
fprintf(stderr, "wav_parse: file too short\n"); last_chunk_len = (*(uint32_t *)(next_chunk + 4)) + 8;
return NULL; next_chunk += last_chunk_len;
}
if(memcmp(next_chunk, "data", 4))
{
fprintf(stderr, "wav_parse: expected \"data\" tag\n");
return NULL;
} }
uint32_t datalen = *(uint32_t *)(buf+24+factlen+fmtlen); uint32_t datalen = *(uint32_t *)(next_chunk + 4);
void *data_void = buf+28+factlen+fmtlen; void *data_void = next_chunk + 8;
if(data_void + datalen > end || data_void + datalen < buf) if(data_void + datalen > end || data_void + datalen < buf)
{ {
fprintf(stderr, "wav_parse: file too short for \"data\" section\n"); fprintf(stderr, "wav_parse: file too short for \"data\" section\n");