From: Rafał Miłecki Date: Thu, 4 Jan 2018 13:58:18 +0000 (+0100) Subject: libfstools: support file paths longer than 255 chars X-Git-Url: http://git.archive.openwrt.org/?p=project%2Ffstools.git;a=commitdiff_plain;h=de6b026d685670fbb10279c4a75a9227d94f22d2;hp=11efbf3b90f031ce634fc38cad07a4aef2985777 libfstools: support file paths longer than 255 chars Alloc globdir buffer dynamically and simply use realloc when needed. This fixes e.g. segmentation fault in jffs2reset due to an infinite recurrency when dealing with longs paths. Signed-off-by: Rafał Miłecki --- diff --git a/libfstools/overlay.c b/libfstools/overlay.c index 8423a57..e610b8d 100644 --- a/libfstools/overlay.c +++ b/libfstools/overlay.c @@ -67,15 +67,29 @@ handle_rmdir(const char *dir) void foreachdir(const char *dir, int (*cb)(const char*)) { + static char *globdir = NULL; + static size_t globdirlen = 0; struct stat s = { 0 }; - char globdir[256]; + size_t dirlen = strlen(dir); glob_t gl; int j; - if (dir[strlen(dir) - 1] == '/') - snprintf(globdir, 256, "%s*", dir); + if (dirlen + sizeof("/*") > globdirlen) { + /* Alloc extra 256 B to avoid too many reallocs */ + size_t len = dirlen + sizeof("/*") + 256; + char *tmp; + + tmp = realloc(globdir, len); + if (!tmp) + return; + globdir = tmp; + globdirlen = len; + } + + if (dir[dirlen - 1] == '/') + sprintf(globdir, "%s*", dir); else - snprintf(globdir, 256, "%s/*", dir); /**/ + sprintf(globdir, "%s/*", dir); if (!glob(globdir, GLOB_NOESCAPE | GLOB_MARK | GLOB_ONLYDIR, NULL, &gl)) for (j = 0; j < gl.gl_pathc; j++) {