Partially handle the irom sub-chunk
Reject soundfonts that have ROM sample types without a valid irom sub-chunk.
This commit is contained in:
parent
05e9c824d5
commit
7206f5873c
@ -556,7 +556,7 @@ static void GenModList_accumMod(GenModList *self, const Modulator *mod)
|
|||||||
goto lbl_; \
|
goto lbl_; \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
static ALboolean ensureFontSanity(const Soundfont *sfont)
|
static ALboolean ensureFontSanity(const Soundfont *sfont, ALboolean has_irom)
|
||||||
{
|
{
|
||||||
ALsizei i;
|
ALsizei i;
|
||||||
|
|
||||||
@ -685,6 +685,17 @@ static ALboolean ensureFontSanity(const Soundfont *sfont)
|
|||||||
return AL_FALSE;
|
return AL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for(i = 0;i < sfont->shdr_size-1;i++)
|
||||||
|
{
|
||||||
|
if((sfont->shdr[i].mSampleType&0x8000) && !has_irom)
|
||||||
|
{
|
||||||
|
WARN("Sample header %d has ROM sample type without an irom sub-chunk\n", i);
|
||||||
|
return AL_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return AL_TRUE;
|
return AL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1072,6 +1083,7 @@ ALboolean loadSf2(Reader *stream, ALsoundfont *soundfont, ALCcontext *context)
|
|||||||
{
|
{
|
||||||
ALsfpreset **presets = NULL;
|
ALsfpreset **presets = NULL;
|
||||||
ALsizei presets_size = 0;
|
ALsizei presets_size = 0;
|
||||||
|
ALchar *irom = NULL;
|
||||||
ALuint version = 0;
|
ALuint version = 0;
|
||||||
ALuint ltype;
|
ALuint ltype;
|
||||||
Soundfont sfont;
|
Soundfont sfont;
|
||||||
@ -1111,12 +1123,25 @@ ALboolean loadSf2(Reader *stream, ALsoundfont *soundfont, ALCcontext *context)
|
|||||||
ALushort major = read_le16(stream);
|
ALushort major = read_le16(stream);
|
||||||
ALushort minor = read_le16(stream);
|
ALushort minor = read_le16(stream);
|
||||||
|
|
||||||
info.mSize -= 4;
|
|
||||||
list.mSize -= 4;
|
list.mSize -= 4;
|
||||||
|
info.mSize -= 4;
|
||||||
|
|
||||||
version = (major<<16) | minor;
|
version = (major<<16) | minor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(info.mCode == FOURCC('i','r','o','m'))
|
||||||
|
{
|
||||||
|
if(info.mSize == 0 || (info.mSize&1))
|
||||||
|
ERR("Invalid irom size: %d\n", info.mSize);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
irom = calloc(1, info.mSize+1);
|
||||||
|
READ(stream, irom, info.mSize);
|
||||||
|
|
||||||
|
list.mSize -= info.mSize;
|
||||||
|
info.mSize -= info.mSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
list.mSize -= info.mSize;
|
list.mSize -= info.mSize;
|
||||||
skip(stream, info.mSize);
|
skip(stream, info.mSize);
|
||||||
}
|
}
|
||||||
@ -1275,7 +1300,7 @@ ALboolean loadSf2(Reader *stream, ALsoundfont *soundfont, ALCcontext *context)
|
|||||||
if(READERR(stream) != 0)
|
if(READERR(stream) != 0)
|
||||||
ERROR_GOTO(error, "Error reading pdta chunk\n");
|
ERROR_GOTO(error, "Error reading pdta chunk\n");
|
||||||
|
|
||||||
if(!ensureFontSanity(&sfont))
|
if(!ensureFontSanity(&sfont, irom!=NULL))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
presets = calloc(1, (sfont.phdr_size-1)*sizeof(presets[0]));
|
presets = calloc(1, (sfont.phdr_size-1)*sizeof(presets[0]));
|
||||||
@ -1378,6 +1403,7 @@ ALboolean loadSf2(Reader *stream, ALsoundfont *soundfont, ALCcontext *context)
|
|||||||
ExchangeInt(&soundfont->NumPresets, presets_size);
|
ExchangeInt(&soundfont->NumPresets, presets_size);
|
||||||
|
|
||||||
free(presets);
|
free(presets);
|
||||||
|
free(irom);
|
||||||
|
|
||||||
Soundfont_Destruct(&sfont);
|
Soundfont_Destruct(&sfont);
|
||||||
|
|
||||||
@ -1391,6 +1417,7 @@ error:
|
|||||||
DeletePreset(presets[i], device);
|
DeletePreset(presets[i], device);
|
||||||
free(presets);
|
free(presets);
|
||||||
}
|
}
|
||||||
|
free(irom);
|
||||||
|
|
||||||
Soundfont_Destruct(&sfont);
|
Soundfont_Destruct(&sfont);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user