diff options
author | Oneric <oneric@oneric.stub> | 2021-07-03 21:45:39 +0200 |
---|---|---|
committer | Oneric <oneric@oneric.stub> | 2021-07-10 03:42:12 +0200 |
commit | 729e48a1eb90bd56b4bb670ee9c8c3821ef12c45 (patch) | |
tree | 591f03737bffdb403515b6253d5e89df53ce94c8 | |
parent | 5733e1c28b92ebbf090bea8f25e252aa40e0b9c4 (diff) | |
download | libass-729e48a1eb90bd56b4bb670ee9c8c3821ef12c45.tar.bz2 libass-729e48a1eb90bd56b4bb670ee9c8c3821ef12c45.tar.xz |
fontselect: remove path length limit
-rw-r--r-- | libass/ass_fontselect.c | 19 |
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); } |