From: Yuxuan Shui <yshui(a)codeweavers.com> Read returns E_FAIL when the EOF is encountered, which was treated as a failure. --- dlls/dmime/midi.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dlls/dmime/midi.c b/dlls/dmime/midi.c index 57b6a3adf90..2b01e85c18c 100644 --- a/dlls/dmime/midi.c +++ b/dlls/dmime/midi.c @@ -332,15 +332,20 @@ static HRESULT midi_parser_parse(struct midi_parser *parser, IDirectMusicSegment for (i = 0;; i++) { - BYTE magic[4] = {0}, last_status = 0; + BYTE magic[4], last_status = 0; DWORD length_be; ULONG length; ULONG read = 0; struct midi_event event = {0}; TRACE("Start parsing track %u\n", i); - if ((hr = IStream_Read(parser->stream, magic, sizeof(magic), &read)) != S_OK) break; - if (read < sizeof(magic)) break; + hr = IStream_Read(parser->stream, magic, sizeof(magic), &read); + if (read < sizeof(magic)) + { + if (hr == E_FAIL) hr = S_OK; + break; + } + if (FAILED(hr)) break; if (memcmp(magic, "MTrk", 4) != 0) break; if ((hr = IStream_Read(parser->stream, &length_be, sizeof(length_be), &read)) != S_OK) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/7230