summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOneric <oneric@oneric.stub>2021-07-03 21:45:39 +0200
committerOneric <oneric@oneric.stub>2021-07-10 03:42:12 +0200
commit729e48a1eb90bd56b4bb670ee9c8c3821ef12c45 (patch)
tree591f03737bffdb403515b6253d5e89df53ce94c8
parent5733e1c28b92ebbf090bea8f25e252aa40e0b9c4 (diff)
downloadlibass-729e48a1eb90bd56b4bb670ee9c8c3821ef12c45.tar.bz2
libass-729e48a1eb90bd56b4bb670ee9c8c3821ef12c45.tar.xz
fontselect: remove path length limit
-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);
}