winegstreamer: Use array_reserve() to reallocate read buffers.

Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2021-10-06 11:46:33 -05:00 committed by Alexandre Julliard
parent 8e9d7b031f
commit 59997c355f
4 changed files with 37 additions and 8 deletions

View file

@ -38,6 +38,8 @@
#include "unixlib.h"
bool array_reserve(void **elements, size_t *capacity, size_t count, size_t size) DECLSPEC_HIDDEN;
static inline const char *debugstr_time(REFERENCE_TIME time)
{
ULONGLONG abstime = time >= 0 ? time : -time;

View file

@ -31,6 +31,33 @@ static unixlib_handle_t unix_handle;
WINE_DEFAULT_DEBUG_CHANNEL(quartz);
bool array_reserve(void **elements, size_t *capacity, size_t count, size_t size)
{
unsigned int new_capacity, max_capacity;
void *new_elements;
if (count <= *capacity)
return TRUE;
max_capacity = ~(SIZE_T)0 / size;
if (count > max_capacity)
return FALSE;
new_capacity = max(4, *capacity);
while (new_capacity < count && new_capacity <= max_capacity / 2)
new_capacity *= 2;
if (new_capacity < count)
new_capacity = max_capacity;
if (!(new_elements = realloc(*elements, new_capacity * size)))
return FALSE;
*elements = new_elements;
*capacity = new_capacity;
return TRUE;
}
struct wg_parser *wg_parser_create(enum wg_parser_type type, bool unlimited_buffering)
{
struct wg_parser_create_params params =

View file

@ -613,7 +613,7 @@ static DWORD CALLBACK read_thread(void *arg)
{
struct media_source *source = arg;
IMFByteStream *byte_stream = source->byte_stream;
uint32_t buffer_size = 0;
size_t buffer_size = 0;
uint64_t file_size;
void *data = NULL;
@ -636,10 +636,10 @@ static DWORD CALLBACK read_thread(void *arg)
else if (offset + size >= file_size)
size = file_size - offset;
if (size > buffer_size)
if (!array_reserve(&data, &buffer_size, size, 1))
{
buffer_size = size;
data = realloc(data, size);
free(data);
return 0;
}
ret_size = 0;

View file

@ -786,7 +786,7 @@ static DWORD CALLBACK read_thread(void *arg)
{
struct parser *filter = arg;
LONGLONG file_size, unused;
uint32_t buffer_size = 0;
size_t buffer_size = 0;
void *data = NULL;
IAsyncReader_Length(filter->reader, &file_size, &unused);
@ -807,10 +807,10 @@ static DWORD CALLBACK read_thread(void *arg)
else if (offset + size >= file_size)
size = file_size - offset;
if (size > buffer_size)
if (!array_reserve(&data, &buffer_size, size, 1))
{
buffer_size = size;
data = realloc(data, size);
free(data);
return 0;
}
hr = IAsyncReader_SyncRead(filter->reader, offset, size, data);