[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