summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libass/ass_fontselect.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/libass/ass_fontselect.c b/libass/ass_fontselect.c
index e2d1cb1..5ba526c 100644
--- a/libass/ass_fontselect.c
+++ b/libass/ass_fontselect.c
@@ -171,22 +171,33 @@ static void load_fonts_from_dir(ASS_Library *library, const char *dir)
DIR *d = opendir(dir);
if (!d)
return;
+ size_t dirlen = strlen(dir);
+ size_t namemax = 0;
+ char *namebuf = NULL;
while (1) {
struct dirent *entry = readdir(d);
if (!entry)
break;
if (entry->d_name[0] == '.')
continue;
- char fullname[4096];
- snprintf(fullname, sizeof(fullname), "%s/%s", dir, entry->d_name);
+ size_t namelen = dirlen + strlen(entry->d_name) + 2;
+ if (namelen > namemax) {
+ size_t newlen = FFMAX(2048, namelen + 256);
+ if (ASS_REALLOC_ARRAY(namebuf, newlen))
+ namemax = newlen;
+ else
+ continue;
+ }
+ snprintf(namebuf, namemax, "%s/%s", dir, entry->d_name);
size_t bufsize = 0;
- ass_msg(library, MSGL_INFO, "Loading font file '%s'", fullname);
- void *data = read_file(library, fullname, &bufsize);
+ ass_msg(library, MSGL_INFO, "Loading font file '%s'", namebuf);
+ void *data = read_file(library, namebuf, &bufsize);
if (data) {
ass_add_font(library, entry->d_name, data, bufsize);
free(data);
}
}
+ free(namebuf);
closedir(d);
}