quartz: Check against a null dereference and don't read beyond the end of file.
diff --git a/dlls/quartz/mpegsplit.c b/dlls/quartz/mpegsplit.c
index ab4d371..cb7528f 100644
--- a/dlls/quartz/mpegsplit.c
+++ b/dlls/quartz/mpegsplit.c
@@ -370,8 +370,12 @@
FIXME("Failed with hres: %08x!\n", hr);
This->skipbytes += This->remaining_bytes;
This->remaining_bytes = 0;
- IMediaSample_Release(This->pCurrentSample);
- This->pCurrentSample = NULL;
+ if (This->pCurrentSample)
+ {
+ IMediaSample_SetActualDataLength(This->pCurrentSample, 0);
+ IMediaSample_Release(This->pCurrentSample);
+ This->pCurrentSample = NULL;
+ }
}
if (BYTES_FROM_MEDIATIME(tStop) >= This->EndOfFile)
@@ -647,6 +651,7 @@
while (pos < This->EndOfFile && SUCCEEDED(hr))
{
LONGLONG length = 0;
+ hr = IAsyncReader_SyncRead(pPin->pReader, pos, 4, header);
while (parse_header(header, &length, &duration))
{
/* No valid header yet; shift by a byte and check again */
@@ -655,11 +660,8 @@
if (FAILED(hr))
break;
}
- if (SUCCEEDED(hr))
- {
- pos += length;
- hr = IAsyncReader_SyncRead(pPin->pReader, pos, 4, header);
- }
+ pos += length;
+ TRACE("Pos: %x%08x/%x%08x\n", (DWORD)(pos >> 32), (DWORD)pos, (DWORD)(This->EndOfFile>>32), (DWORD)This->EndOfFile);
}
hr = S_OK;
TRACE("Duration: %d seconds\n", (DWORD)(duration / 10000000));