提交 f6087fb7 编写于 作者: J Joel Becker 提交者: Mark Fasheh

ocfs2: Check xattr block signatures properly.

The xattr.c code is currently memcmp()ing naking buffer pointers.
Create the OCFS2_IS_VALID_XATTR_BLOCK() macro to match its peers and use
that.

In addition, failed signature checks were returning -EFAULT, which is
completely wrong.  Return -EIO.
Signed-off-by: NJoel Becker <joel.becker@oracle.com>
Signed-off-by: NMark Fasheh <mfasheh@suse.com>
上级 c988fd04
...@@ -473,6 +473,9 @@ static inline int ocfs2_uses_extended_slot_map(struct ocfs2_super *osb) ...@@ -473,6 +473,9 @@ static inline int ocfs2_uses_extended_slot_map(struct ocfs2_super *osb)
(____gd)->bg_signature); \ (____gd)->bg_signature); \
} while (0) } while (0)
#define OCFS2_IS_VALID_XATTR_BLOCK(ptr) \
(!strcmp((ptr)->xb_signature, OCFS2_XATTR_BLOCK_SIGNATURE))
static inline unsigned long ino_from_blkno(struct super_block *sb, static inline unsigned long ino_from_blkno(struct super_block *sb,
u64 blkno) u64 blkno)
{ {
......
...@@ -555,14 +555,12 @@ static int ocfs2_xattr_block_list(struct inode *inode, ...@@ -555,14 +555,12 @@ static int ocfs2_xattr_block_list(struct inode *inode,
mlog_errno(ret); mlog_errno(ret);
return ret; return ret;
} }
/*Verify the signature of xattr block*/
if (memcmp((void *)blk_bh->b_data, OCFS2_XATTR_BLOCK_SIGNATURE,
strlen(OCFS2_XATTR_BLOCK_SIGNATURE))) {
ret = -EFAULT;
goto cleanup;
}
xb = (struct ocfs2_xattr_block *)blk_bh->b_data; xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
if (!OCFS2_IS_VALID_XATTR_BLOCK(xb)) {
ret = -EIO;
goto cleanup;
}
if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) { if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) {
struct ocfs2_xattr_header *header = &xb->xb_attrs.xb_header; struct ocfs2_xattr_header *header = &xb->xb_attrs.xb_header;
...@@ -779,15 +777,14 @@ static int ocfs2_xattr_block_get(struct inode *inode, ...@@ -779,15 +777,14 @@ static int ocfs2_xattr_block_get(struct inode *inode,
mlog_errno(ret); mlog_errno(ret);
return ret; return ret;
} }
/*Verify the signature of xattr block*/
if (memcmp((void *)blk_bh->b_data, OCFS2_XATTR_BLOCK_SIGNATURE, xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
strlen(OCFS2_XATTR_BLOCK_SIGNATURE))) { if (!OCFS2_IS_VALID_XATTR_BLOCK(xb)) {
ret = -EFAULT; ret = -EIO;
goto cleanup; goto cleanup;
} }
xs->xattr_bh = blk_bh; xs->xattr_bh = blk_bh;
xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) { if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) {
xs->header = &xb->xb_attrs.xb_header; xs->header = &xb->xb_attrs.xb_header;
...@@ -1527,10 +1524,9 @@ static int ocfs2_xattr_free_block(struct inode *inode, ...@@ -1527,10 +1524,9 @@ static int ocfs2_xattr_free_block(struct inode *inode,
goto out; goto out;
} }
/*Verify the signature of xattr block*/ xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
if (memcmp((void *)blk_bh->b_data, OCFS2_XATTR_BLOCK_SIGNATURE, if (!OCFS2_IS_VALID_XATTR_BLOCK(xb)) {
strlen(OCFS2_XATTR_BLOCK_SIGNATURE))) { ret = -EIO;
ret = -EFAULT;
goto out; goto out;
} }
...@@ -1540,7 +1536,6 @@ static int ocfs2_xattr_free_block(struct inode *inode, ...@@ -1540,7 +1536,6 @@ static int ocfs2_xattr_free_block(struct inode *inode,
goto out; goto out;
} }
xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
blk = le64_to_cpu(xb->xb_blkno); blk = le64_to_cpu(xb->xb_blkno);
bit = le16_to_cpu(xb->xb_suballoc_bit); bit = le16_to_cpu(xb->xb_suballoc_bit);
bg_blkno = ocfs2_which_suballoc_group(blk, bit); bg_blkno = ocfs2_which_suballoc_group(blk, bit);
...@@ -1784,15 +1779,14 @@ static int ocfs2_xattr_block_find(struct inode *inode, ...@@ -1784,15 +1779,14 @@ static int ocfs2_xattr_block_find(struct inode *inode,
mlog_errno(ret); mlog_errno(ret);
return ret; return ret;
} }
/*Verify the signature of xattr block*/
if (memcmp((void *)blk_bh->b_data, OCFS2_XATTR_BLOCK_SIGNATURE, xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
strlen(OCFS2_XATTR_BLOCK_SIGNATURE))) { if (!OCFS2_IS_VALID_XATTR_BLOCK(xb)) {
ret = -EFAULT; ret = -EIO;
goto cleanup; goto cleanup;
} }
xs->xattr_bh = blk_bh; xs->xattr_bh = blk_bh;
xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) { if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) {
xs->header = &xb->xb_attrs.xb_header; xs->header = &xb->xb_attrs.xb_header;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册