mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-15 06:10:39 +00:00
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:
parent
8e9d7b031f
commit
59997c355f
|
@ -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;
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue