From 8701c535d63551b6d42d396c106e844d5b0f4abd Mon Sep 17 00:00:00 2001 From: Oneric Date: Fri, 26 Mar 2021 16:28:29 +0100 Subject: library: replace grow_array with ASS_REALLOC_ARRAY The latter has overflow protections for size_t indexation and element size > 1, the former none whatsoever. Change all related vars to size_t. Additionally, switch to exponential buffer growth. --- libass/ass_fontselect.c | 3 +-- libass/ass_library.c | 20 ++++---------------- libass/ass_library.h | 2 +- 3 files changed, 6 insertions(+), 19 deletions(-) diff --git a/libass/ass_fontselect.c b/libass/ass_fontselect.c index 3bf034b..d8313c5 100644 --- a/libass/ass_fontselect.c +++ b/libass/ass_fontselect.c @@ -992,7 +992,6 @@ static ASS_FontProvider * ass_embedded_fonts_add_provider(ASS_Library *lib, ASS_FontSelector *selector, FT_Library ftlib) { - int i; ASS_FontProvider *priv = ass_font_provider_new(selector, &ft_funcs, NULL); if (priv == NULL) return NULL; @@ -1001,7 +1000,7 @@ ass_embedded_fonts_add_provider(ASS_Library *lib, ASS_FontSelector *selector, load_fonts_from_dir(lib, lib->fonts_dir); } - for (i = 0; i < lib->num_fontdata; ++i) + for (size_t i = 0; i < lib->num_fontdata; i++) process_fontdata(priv, lib, ftlib, i); return priv; diff --git a/libass/ass_library.c b/libass/ass_library.c index 21deea5..745798e 100644 --- a/libass/ass_library.c +++ b/libass/ass_library.c @@ -95,24 +95,13 @@ void ass_set_style_overrides(ASS_Library *priv, char **list) *q = strdup(*p); } -static int grow_array(void **array, int nelem, size_t elsize) -{ - if (!(nelem & 31)) { - void *ptr = realloc(*array, (nelem + 32) * elsize); - if (!ptr) - return 0; - *array = ptr; - } - return 1; -} - void ass_add_font(ASS_Library *priv, const char *name, const char *data, int size) { - int idx = priv->num_fontdata; + size_t idx = priv->num_fontdata; if (!name || !data || !size) return; - if (!grow_array((void **) &priv->fontdata, priv->num_fontdata, - sizeof(*priv->fontdata))) + if (!(idx & (idx - 32)) && // power of two >= 32, or zero --> time for realloc + !ASS_REALLOC_ARRAY(priv->fontdata, FFMAX(2 * idx, 32))) return; priv->fontdata[idx].name = strdup(name); @@ -135,8 +124,7 @@ error: void ass_clear_fonts(ASS_Library *priv) { - int i; - for (i = 0; i < priv->num_fontdata; ++i) { + for (size_t i = 0; i < priv->num_fontdata; i++) { free(priv->fontdata[i].name); free(priv->fontdata[i].data); } diff --git a/libass/ass_library.h b/libass/ass_library.h index 8144f8e..674e06c 100644 --- a/libass/ass_library.h +++ b/libass/ass_library.h @@ -33,7 +33,7 @@ struct ass_library { char **style_overrides; ASS_Fontdata *fontdata; - int num_fontdata; + size_t num_fontdata; void (*msg_callback)(int, const char *, va_list, void *); void *msg_callback_data; }; -- cgit v1.2.3