[LEDE-DEV] [PATCH] libfstools: support file paths longer than 255 chars
Andrey Jr. Melnikov
temnota.am at gmail.com
Sat Jan 6 04:17:28 PST 2018
Rafa?? Mi??ecki <zajec5 at gmail.com> wrote:
> From: Rafa?? Mi??ecki <rafal at milecki.pl>
> 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 at milecki.pl>
> ---
> libfstools/overlay.c | 21 +++++++++++++++++----
> 1 file changed, 17 insertions(+), 4 deletions(-)
> diff --git a/libfstools/overlay.c b/libfstools/overlay.c
> index 8423a57..a7c4f02 100644
> --- a/libfstools/overlay.c
> +++ b/libfstools/overlay.c
> @@ -67,15 +67,28 @@ handle_rmdir(const char *dir)
> void
> foreachdir(const char *dir, int (*cb)(const char*))
> {
> + static char *globdir;
> + static size_t globdirlen;
> 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 + 3 > globdirlen) {
> + size_t len = dirlen + 3 + 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++) {
You missed call to free(globdir); at end.
And original source missing globfree(gl); after for (..) loop.
More information about the Lede-dev
mailing list