ref: f2fa7af49a29bfffeab02552c6bc4a1e183fa8d5
parent: f3dc1066e65a37f612ec852c1f0f4f894a46841a
author: knik <knik>
date: Tue Sep 7 11:14:02 EDT 2010
Fixed wav_open_read() to skip all unknown subchunk types
--- a/frontend/input.c
+++ b/frontend/input.c
@@ -16,7 +16,7 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * $Id: input.c,v 1.16 2009/01/25 18:50:32 menno Exp $
+ * $Id: input.c,v 1.17 2010/09/07 15:14:02 knik Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -116,10 +116,29 @@
fprintf(stderr, "%s: file format not supported\n", name);
}
+
+static int seekchunk(FILE *f, riffsub_t *riffsub, char *name)
+{
+ while (1)
+ {
+ if (fread(riffsub, 1, sizeof(*riffsub), f) != sizeof(*riffsub))
+ return 0;
+
+ riffsub->len = UINT32(riffsub->len);
+ if (riffsub->len & 1)
+ riffsub->len++;
+
+ if (!memcmp(&(riffsub->label), name, 4))
+ break;
+
+ fseek(f, riffsub->len, SEEK_CUR);
+ }
+
+ return 1;
+}
+
pcmfile_t *wav_open_read(const char *name, int rawinput)
{
- int i;
- int skip;
FILE *wave_f;
riff_t riff;
riffsub_t riffsub;
@@ -126,7 +145,6 @@
struct WAVEFORMATEXTENSIBLE wave;
char *riffl = "RIFF";
char *wavel = "WAVE";
- char *bextl = "BEXT";
char *fmtl = "fmt ";
char *datal = "data";
int fmtsize;
@@ -156,20 +174,9 @@
if (memcmp(&(riff.chunk_type), wavel, 4))
return NULL;
- // handle broadcast extensions. added by pro-tools,otherwise it must be fmt chunk.
- if (fread(&riffsub, 1, sizeof(riffsub), wave_f) != sizeof(riffsub))
- return NULL;
- riffsub.len = UINT32(riffsub.len);
+ if (!seekchunk(wave_f, &riffsub, fmtl))
+ return NULL;
- if (!memcmp(&(riffsub.label), bextl, 4))
- {
- fseek(wave_f, riffsub.len, SEEK_CUR);
-
- if (fread(&riffsub, 1, sizeof(riffsub), wave_f) != sizeof(riffsub))
- return NULL;
- riffsub.len = UINT32(riffsub.len);
- }
-
if (memcmp(&(riffsub.label), fmtl, 4))
return NULL;
memset(&wave, 0, sizeof(wave));
@@ -178,22 +185,11 @@
if (fread(&wave, 1, fmtsize, wave_f) != fmtsize)
return NULL;
- for (skip = riffsub.len - fmtsize; skip > 0; skip--)
- fgetc(wave_f);
+ fseek(wave_f, riffsub.len - fmtsize, SEEK_CUR);
- for (i = 0;; i++)
- {
- if (fread(&riffsub, 1, sizeof(riffsub), wave_f) != sizeof(riffsub))
- return NULL;
- riffsub.len = UINT32(riffsub.len);
- if (!memcmp(&(riffsub.label), datal, 4))
- break;
- if (i > 10)
- return NULL;
+ if (!seekchunk(wave_f, &riffsub, datal))
+ return NULL;
- for (skip = riffsub.len; skip > 0; skip--)
- fgetc(wave_f);
- }
if (UINT16(wave.Format.wFormatTag) != WAVE_FORMAT_PCM && UINT16(wave.Format.wFormatTag) != WAVE_FORMAT_FLOAT)
{
if (UINT16(wave.Format.wFormatTag) == WAVE_FORMAT_EXTENSIBLE)