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: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mfasheh@suse.com>
This commit is contained in:
@@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user