From: Michael Stefaniuc mstefani@winehq.org
--- dlls/dmusic/band.c | 7 ++----- dlls/dmusic/dmobject.c | 11 +++++++++++ dlls/dmusic/dmobject.h | 2 ++ 3 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/dlls/dmusic/band.c b/dlls/dmusic/band.c index cfced6692a8..d6cc4aab440 100644 --- a/dlls/dmusic/band.c +++ b/dlls/dmusic/band.c @@ -239,12 +239,9 @@ static HRESULT parse_lbin_list(struct band *This, IStream *stream, struct chunk_ switch (MAKE_IDTYPE(chunk.id, chunk.type)) { case DMUS_FOURCC_INSTRUMENT_CHUNK: - { - UINT size = sizeof(inst); - if (chunk.size == offsetof(DMUS_IO_INSTRUMENT, nPitchBendRange)) size = chunk.size; - if (FAILED(hr = stream_chunk_get_data(stream, &chunk, &inst, size))) break; + hr = stream_chunk_get_data_alt(stream, &chunk, &inst, sizeof(inst), + offsetof(DMUS_IO_INSTRUMENT, nPitchBendRange)); break; - }
case MAKE_IDTYPE(FOURCC_LIST, DMUS_FOURCC_REF_LIST): { diff --git a/dlls/dmusic/dmobject.c b/dlls/dmusic/dmobject.c index b1aa91d849f..8b83ba41fc8 100644 --- a/dlls/dmusic/dmobject.c +++ b/dlls/dmusic/dmobject.c @@ -437,6 +437,17 @@ HRESULT stream_chunk_get_data(IStream *stream, const struct chunk_entry *chunk, return stream_read(stream, data, size); }
+HRESULT stream_chunk_get_data_alt(IStream *stream, const struct chunk_entry *chunk, void *data, + ULONG size, ULONG alt_size) +{ + if (chunk->size != size && chunk->size != alt_size) { + WARN_(dmfile)("%s: doesn't contains the expected data size %lu or %lu\n", debugstr_chunk(chunk), + size, alt_size); + return E_FAIL; + } + return stream_read(stream, data, chunk->size); +} + HRESULT stream_chunk_get_wstr(IStream *stream, const struct chunk_entry *chunk, WCHAR *str, ULONG size) { diff --git a/dlls/dmusic/dmobject.h b/dlls/dmusic/dmobject.h index f2f3ab5215d..183f866ba71 100644 --- a/dlls/dmusic/dmobject.h +++ b/dlls/dmusic/dmobject.h @@ -43,6 +43,8 @@ HRESULT stream_chunk_get_array_alt(IStream *stream, const struct chunk_entry *ch unsigned int *count, DWORD elem_size, DWORD alt_size); HRESULT stream_chunk_get_data(IStream *stream, const struct chunk_entry *chunk, void *data, ULONG size); +HRESULT stream_chunk_get_data_alt(IStream *stream, const struct chunk_entry *chunk, void *data, + ULONG size, ULONG alt_size); HRESULT stream_chunk_get_wstr(IStream *stream, const struct chunk_entry *chunk, WCHAR *str, ULONG size);