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 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++) {