[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <3D6EA2A3-CC61-4243-982F-E53305EA0231@dilger.ca>
Date: Tue, 14 May 2019 09:32:55 -0600
From: Andreas Dilger <adilger@...ger.ca>
To: Chengguang Xu <cgxu519@...o.com.cn>
Cc: Jan Kara <jack@...e.com>, linux-ext4 <linux-ext4@...r.kernel.org>
Subject: Re: [PATCH v2 2/2] ext2: introduce helper for xattr entry validation
On May 13, 2019, at 4:40 PM, Chengguang Xu <cgxu519@...o.com.cn> wrote:
>
> Introduce helper function ext2_xattr_entry_valid()
> for xattr entry validation and clean up the entry
> check ralated code.
>
> Signed-off-by: Chengguang Xu <cgxu519@...o.com.cn>
Reviewed-by: Andreas Dilger <adilger@...ger.ca>
> ---
> v1->v2:
> - Pass end offset instead of inode to ext2_xattr_entry_valid()
> - Change signed-off mail address.
>
> fs/ext2/xattr.c | 21 +++++++++++++++++----
> 1 file changed, 17 insertions(+), 4 deletions(-)
>
> diff --git a/fs/ext2/xattr.c b/fs/ext2/xattr.c
> index db27260d6a5b..d11c83529514 100644
> --- a/fs/ext2/xattr.c
> +++ b/fs/ext2/xattr.c
> @@ -144,6 +144,20 @@ ext2_xattr_header_valid(struct ext2_xattr_header *header)
> return true;
> }
>
> +static bool
> +ext2_xattr_entry_valid(struct ext2_xattr_entry *entry, size_t size,
> + size_t end_offs)
> +{
> + if (entry->e_value_block != 0)
> + return false;
> +
> + if (size > end_offs ||
> + le16_to_cpu(entry->e_value_offs) + size > end_offs)
> + return false;
> +
> + return true;
> +}
> +
> /*
> * ext2_xattr_get()
> *
> @@ -217,8 +231,7 @@ ext2_xattr_get(struct inode *inode, int name_index, const char *name,
> if (entry->e_value_block != 0)
> goto bad_block;
> size = le32_to_cpu(entry->e_value_size);
> - if (size > inode->i_sb->s_blocksize ||
> - le16_to_cpu(entry->e_value_offs) + size > inode->i_sb->s_blocksize)
> + if (!ext2_xattr_entry_valid(entry, size, inode->i_sb->s_blocksize))
> goto bad_block;
>
> if (ext2_xattr_cache_insert(ea_block_cache, bh))
> @@ -483,8 +496,8 @@ ext2_xattr_set(struct inode *inode, int name_index, const char *name,
> if (!here->e_value_block && here->e_value_size) {
> size_t size = le32_to_cpu(here->e_value_size);
>
> - if (le16_to_cpu(here->e_value_offs) + size >
> - sb->s_blocksize || size > sb->s_blocksize)
> + if (!ext2_xattr_entry_valid(here, size,
> + inode->i_sb->s_blocksize))
> goto bad_block;
> free += EXT2_XATTR_SIZE(size);
> }
> --
> 2.17.2
>
>
Cheers, Andreas
Download attachment "signature.asc" of type "application/pgp-signature" (874 bytes)
Powered by blists - more mailing lists