[PATCH v2 19/28] fs/squashfs: sqfs_get_abs_path: fix possible memory leak on error

João Marcos Costa jmcosta944 at gmail.com
Tue Nov 3 13:44:47 CET 2020


Reviewed-by Joao Marcos Costa <jmcosta944 at gmail.com>

Em ter., 3 de nov. de 2020 às 08:12, Richard Genoud <
richard.genoud at posteo.net> escreveu:

> if  sqfs_tokenize(rel_tokens, rc, rel); fails, the function exits
> without freeing the array base_tokens.
>
> Signed-off-by: Richard Genoud <richard.genoud at posteo.net>
> ---
>  fs/squashfs/sqfs.c | 32 ++++++++++++++++++--------------
>  1 file changed, 18 insertions(+), 14 deletions(-)
>
> diff --git a/fs/squashfs/sqfs.c b/fs/squashfs/sqfs.c
> index 825d5d13fa2..f41deece0ae 100644
> --- a/fs/squashfs/sqfs.c
> +++ b/fs/squashfs/sqfs.c
> @@ -340,28 +340,31 @@ static char *sqfs_get_abs_path(const char *base,
> const char *rel)
>         char **base_tokens, **rel_tokens, *resolved = NULL;
>         int ret, bc, rc, i, updir = 0, resolved_size = 0, offset = 0;
>
> +       base_tokens = NULL;
> +       rel_tokens = NULL;
> +
>         /* Memory allocation for the token lists */
>         bc = sqfs_count_tokens(base);
>         rc = sqfs_count_tokens(rel);
>         if (bc < 1 || rc < 1)
>                 return NULL;
>
> -       base_tokens = malloc(bc * sizeof(char *));
> +       base_tokens = calloc(bc, sizeof(char *));
>         if (!base_tokens)
>                 return NULL;
>
> -       rel_tokens = malloc(rc * sizeof(char *));
> +       rel_tokens = calloc(rc, sizeof(char *));
>         if (!rel_tokens)
> -               goto free_b_tokens;
> +               goto out;
>
>         /* Fill token lists */
>         ret = sqfs_tokenize(base_tokens, bc, base);
>         if (ret)
> -               goto free_r_tokens;
> +               goto out;
>
>         ret = sqfs_tokenize(rel_tokens, rc, rel);
>         if (ret)
> -               goto free_r_tokens;
> +               goto out;
>
>         /* count '..' occurrences in target path */
>         for (i = 0; i < rc; i++) {
> @@ -372,7 +375,7 @@ static char *sqfs_get_abs_path(const char *base, const
> char *rel)
>         /* Remove the last token and the '..' occurrences */
>         bc = sqfs_clean_base_path(base_tokens, bc, updir);
>         if (bc < 0)
> -               goto free_r_tokens;
> +               goto out;
>
>         /* Calculate resolved path size */
>         if (!bc)
> @@ -383,7 +386,7 @@ static char *sqfs_get_abs_path(const char *base, const
> char *rel)
>
>         resolved = malloc(resolved_size + 1);
>         if (!resolved)
> -               goto free_r_tokens_loop;
> +               goto out;
>
>         /* Set resolved path */
>         memset(resolved, '\0', resolved_size + 1);
> @@ -391,14 +394,15 @@ static char *sqfs_get_abs_path(const char *base,
> const char *rel)
>         resolved[offset++] = '/';
>         offset += sqfs_join(rel_tokens, resolved + offset, updir, rc, '/');
>
> -free_r_tokens_loop:
> -       for (i = 0; i < rc; i++)
> -               free(rel_tokens[i]);
> -       for (i = 0; i < bc; i++)
> -               free(base_tokens[i]);
> -free_r_tokens:
> +out:
> +       if (rel_tokens)
> +               for (i = 0; i < rc; i++)
> +                       free(rel_tokens[i]);
> +       if (base_tokens)
> +               for (i = 0; i < bc; i++)
> +                       free(base_tokens[i]);
> +
>         free(rel_tokens);
> -free_b_tokens:
>         free(base_tokens);
>
>         return resolved;
>


-- 
Atenciosamente,
João Marcos Costa

www.linkedin.com/in/jmarcoscosta/
https://github.com/jmarcoscosta


More information about the U-Boot mailing list