From 903d43bbb85a2846030cdfaae8b6d7597b16a1d6 Mon Sep 17 00:00:00 2001 From: FRIGN Date: Tue, 3 Mar 2015 00:11:41 +0100 Subject: [PATCH] Use dynamic array in recurse() instead of PATH_MAX-array Thanks Evan! --- libutil/recurse.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/libutil/recurse.c b/libutil/recurse.c index f30f160..295899a 100644 --- a/libutil/recurse.c +++ b/libutil/recurse.c @@ -15,10 +15,11 @@ int recurse_follow = 'P'; void recurse(const char *path, void (*fn)(const char *, int), int depth) { - char buf[PATH_MAX]; struct dirent *d; struct stat lst, st; DIR *dp; + size_t len; + char *buf; if (lstat(path, &lst) < 0) eprintf("lstat %s:", path); @@ -31,17 +32,14 @@ recurse(const char *path, void (*fn)(const char *, int), int depth) if (!(dp = opendir(path))) eprintf("opendir %s:", path); + len = strlen(path); while ((d = readdir(dp))) { if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, "..")) continue; - if (strlcpy(buf, path, sizeof(buf)) >= sizeof(buf)) - eprintf("path too long\n"); - if (buf[strlen(buf) - 1] != '/') - if (strlcat(buf, "/", sizeof(buf)) >= sizeof(buf)) - eprintf("path too long\n"); - if (strlcat(buf, d->d_name, sizeof(buf)) >= sizeof(buf)) - eprintf("path too long\n"); + buf = emalloc(len + (*(path + len) != '/') + strlen(d->d_name) + 1); + sprintf(buf, "%s%s%s", path, (*(path + len) == '/') ? "" : "/", d->d_name); fn(buf, depth + 1); + free(buf); } closedir(dp);