summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafał Miłecki <rafal@milecki.pl>2018-01-04 14:58:18 +0100
committerRafał Miłecki <rafal@milecki.pl>2018-01-05 14:48:27 +0100
commitde6b026d685670fbb10279c4a75a9227d94f22d2 (patch)
tree8221e8f9a3e0d1c79dc0017b2af3c47a04888ed9
parent11efbf3b90f031ce634fc38cad07a4aef2985777 (diff)
downloadfstools-de6b026d685670fbb10279c4a75a9227d94f22d2.tar.gz
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 <rafal@milecki.pl>
-rw-r--r--libfstools/overlay.c22
1 files changed, 18 insertions, 4 deletions
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++) {