diff options
author | wm4 <wm4@nowhere> | 2014-11-09 10:41:54 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-11-09 10:41:54 +0100 |
commit | 11300cd37fc0038f3004b0da5748091f5f763738 (patch) | |
tree | 243fa115af89216ee2a4463edcef440c488f7448 /libass/ass_library.c | |
parent | dc054a1fdb1e9145e905612f296bbafd5ba7b530 (diff) | |
download | libass-11300cd37fc0038f3004b0da5748091f5f763738.tar.bz2 libass-11300cd37fc0038f3004b0da5748091f5f763738.tar.xz |
Check more mallocs
This is just a start and gets most easy ones.
Diffstat (limited to 'libass/ass_library.c')
-rw-r--r-- | libass/ass_library.c | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/libass/ass_library.c b/libass/ass_library.c index b33ca55..5b7a5c9 100644 --- a/libass/ass_library.c +++ b/libass/ass_library.c @@ -40,8 +40,8 @@ static void ass_msg_handler(int level, const char *fmt, va_list va, void *data) ASS_Library *ass_library_init(void) { ASS_Library* lib = calloc(1, sizeof(*lib)); - lib->msg_callback = ass_msg_handler; - + if (lib) + lib->msg_callback = ass_msg_handler; return lib; } @@ -86,16 +86,22 @@ void ass_set_style_overrides(ASS_Library *priv, char **list) for (p = list, cnt = 0; *p; ++p, ++cnt) { } - priv->style_overrides = malloc((cnt + 1) * sizeof(char *)); + priv->style_overrides = calloc(cnt + 1, sizeof(char *)); + if (!priv->style_overrides) + return; for (p = list, q = priv->style_overrides; *p; ++p, ++q) *q = strdup(*p); - priv->style_overrides[cnt] = NULL; } -static void grow_array(void **array, int nelem, size_t elsize) +static int grow_array(void **array, int nelem, size_t elsize) { - if (!(nelem & 31)) - *array = realloc(*array, (nelem + 32) * 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, char *name, char *data, int size) @@ -103,17 +109,26 @@ void ass_add_font(ASS_Library *priv, char *name, char *data, int size) int idx = priv->num_fontdata; if (!name || !data || !size) return; - grow_array((void **) &priv->fontdata, priv->num_fontdata, - sizeof(*priv->fontdata)); + if (!grow_array((void **) &priv->fontdata, priv->num_fontdata, + sizeof(*priv->fontdata))) + return; priv->fontdata[idx].name = strdup(name); - priv->fontdata[idx].data = malloc(size); + + if (!priv->fontdata[idx].name || !priv->fontdata[idx].data) + goto error; + memcpy(priv->fontdata[idx].data, data, size); priv->fontdata[idx].size = size; priv->num_fontdata++; + return; + +error: + free(priv->fontdata[idx].name); + free(priv->fontdata[idx].data); } void ass_clear_fonts(ASS_Library *priv) |