From: Yuxuan Shui yshui@codeweavers.com
Renaming destroy_stream to free_stream_buffers because that's what it does.
wg_parser_disconnect frees all streams on the wg_parser, but free_stream_buffers later calls wg_parser_stream_release_buffer on those streams. It has saved pointers to those in wm_stream->wg_stream, which became dangling pointers after wg_parser_disconnect. --- dlls/winegstreamer/wm_reader.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index 8507d35233a..467662b964c 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1454,7 +1454,7 @@ static const IWMReaderTimecodeVtbl timecode_vtbl = timecode_GetTimecodeRangeBounds, };
-static void destroy_stream(struct wm_reader *reader) +static void free_stream_buffers(struct wm_reader *reader) { unsigned int i;
@@ -1587,6 +1587,9 @@ static HRESULT reinit_stream(struct wm_reader *reader, bool read_compressed) WORD i;
ReleaseSemaphore(reader->read_sem, 1, NULL); + + free_stream_buffers(reader); + wg_parser_disconnect(reader->wg_parser);
EnterCriticalSection(&reader->shutdown_cs); @@ -1598,7 +1601,6 @@ static HRESULT reinit_stream(struct wm_reader *reader, bool read_compressed) reader->read_thread = NULL; reader->read_sem = NULL;
- destroy_stream(reader); wg_parser_destroy(reader->wg_parser); reader->wg_parser = 0;
@@ -1665,7 +1667,7 @@ out_destroy_parser: CloseHandle(reader->read_sem); reader->read_sem = NULL; } - destroy_stream(reader); + free_stream_buffers(reader); wg_parser_destroy(reader->wg_parser); reader->wg_parser = 0;
@@ -1945,6 +1947,9 @@ static HRESULT WINAPI reader_Close(IWMSyncReader2 *iface) }
ReleaseSemaphore(reader->read_sem, 1, NULL); + + free_stream_buffers(reader); + wg_parser_disconnect(reader->wg_parser);
EnterCriticalSection(&reader->shutdown_cs); @@ -1956,7 +1961,6 @@ static HRESULT WINAPI reader_Close(IWMSyncReader2 *iface) reader->read_thread = NULL; reader->read_sem = NULL;
- destroy_stream(reader); wg_parser_destroy(reader->wg_parser); reader->wg_parser = 0;