[PATCH v2 03/28] fs/squashfs: sqfs_opendir: simplify error handling

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


I am not sure if this simplification follows the most commonly used
strategy for handling errors (in U-Boot's source code), but it does not
bother me either.
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:

> Using only one label permits to prevents bugs when moving code around.
>
> Signed-off-by: Richard Genoud <richard.genoud at posteo.net>
> ---
>  fs/squashfs/sqfs.c | 27 ++++++++++++---------------
>  1 file changed, 12 insertions(+), 15 deletions(-)
>
> diff --git a/fs/squashfs/sqfs.c b/fs/squashfs/sqfs.c
> index 1fdb9ac534b..b94a9715205 100644
> --- a/fs/squashfs/sqfs.c
> +++ b/fs/squashfs/sqfs.c
> @@ -812,9 +812,9 @@ free_dtb:
>  int sqfs_opendir(const char *filename, struct fs_dir_stream **dirsp)
>  {
>         unsigned char *inode_table = NULL, *dir_table = NULL;
> -       int j, token_count, ret = 0, metablks_count;
> +       int j, token_count = 0, ret = 0, metablks_count;
>         struct squashfs_dir_stream *dirs;
> -       char **token_list, *path;
> +       char **token_list = NULL, *path = NULL;
>         u32 *pos_list = NULL;
>
>         dirs = malloc(sizeof(*dirs));
> @@ -831,38 +831,38 @@ int sqfs_opendir(const char *filename, struct
> fs_dir_stream **dirsp)
>         ret = sqfs_read_inode_table(&inode_table);
>         if (ret) {
>                 ret = -EINVAL;
> -               goto free_dirs;
> +               goto out;
>         }
>
>         metablks_count = sqfs_read_directory_table(&dir_table, &pos_list);
>         if (metablks_count < 1) {
>                 ret = -EINVAL;
> -               goto free_inode_table;
> +               goto out;
>         }
>
>         /* Tokenize filename */
>         token_count = sqfs_count_tokens(filename);
>         if (token_count < 0) {
>                 ret = -EINVAL;
> -               goto free_inode_table;
> +               goto out;
>         }
>
>         path = strdup(filename);
>         if (!path) {
>                 ret = -EINVAL;
> -               goto free_inode_table;
> +               goto out;
>         }
>
>         token_list = malloc(token_count * sizeof(char *));
>         if (!token_list) {
>                 ret = -EINVAL;
> -               goto free_path;
> +               goto out;
>         }
>
>         /* Fill tokens list */
>         ret = sqfs_tokenize(token_list, token_count, path);
>         if (ret)
> -               goto free_tokens;
> +               goto out;
>         /*
>          * ldir's (extended directory) size is greater than dir, so it
> works as
>          * a general solution for the malloc size, since 'i' is a union.
> @@ -872,7 +872,7 @@ int sqfs_opendir(const char *filename, struct
> fs_dir_stream **dirsp)
>         ret = sqfs_search_dir(dirs, token_list, token_count, pos_list,
>                               metablks_count);
>         if (ret)
> -               goto free_tokens;
> +               goto out;
>
>         if (le16_to_cpu(dirs->i_dir.inode_type) == SQFS_DIR_TYPE)
>                 dirs->size = le16_to_cpu(dirs->i_dir.file_size);
> @@ -890,19 +890,16 @@ int sqfs_opendir(const char *filename, struct
> fs_dir_stream **dirsp)
>
>         *dirsp = (struct fs_dir_stream *)dirs;
>
> -free_tokens:
> +out:
>         for (j = 0; j < token_count; j++)
>                 free(token_list[j]);
>         free(token_list);
>         free(pos_list);
> -free_path:
>         free(path);
> -free_inode_table:
> -       if (ret)
> +       if (ret) {
>                 free(inode_table);
> -free_dirs:
> -       if (ret)
>                 free(dirs);
> +       }
>
>         return ret;
>  }
>


-- 
Atenciosamente,
João Marcos Costa

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


More information about the U-Boot mailing list