summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOneric <oneric@oneric.stub>2021-03-26 16:28:29 +0100
committerOneric <oneric@oneric.stub>2021-04-22 23:56:34 +0200
commit8701c535d63551b6d42d396c106e844d5b0f4abd (patch)
tree13a4527c03e63f1724b53281923f8cfd37662d9f
parent026d65e707637b0f90902bca48654871e33575f3 (diff)
downloadlibass-8701c535d63551b6d42d396c106e844d5b0f4abd.tar.bz2
libass-8701c535d63551b6d42d396c106e844d5b0f4abd.tar.xz
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.
-rw-r--r--libass/ass_fontselect.c3
-rw-r--r--libass/ass_library.c20
-rw-r--r--libass/ass_library.h2
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;
};