aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Becker <joel.becker@oracle.com>2008-10-20 21:20:43 -0400
committerMark Fasheh <mfasheh@suse.com>2008-11-10 12:51:44 -0500
commitf6087fb799e097e7c9d912daa75701de9d62dc53 (patch)
tree010e8455fa5e53e68c76b949b4abd39876c2921f
parentc988fd045f1195e62c0970384903ab9da26a9359 (diff)
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>
-rw-r--r--fs/ocfs2/ocfs2.h3
-rw-r--r--fs/ocfs2/xattr.c38
2 files changed, 19 insertions, 22 deletions
diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h
index a21a465490c4..fef7ece32376 100644
--- a/fs/ocfs2/ocfs2.h
+++ b/fs/ocfs2/ocfs2.h
@@ -473,6 +473,9 @@ static inline int ocfs2_uses_extended_slot_map(struct ocfs2_super *osb)
473 (____gd)->bg_signature); \ 473 (____gd)->bg_signature); \
474} while (0) 474} while (0)
475 475
476#define OCFS2_IS_VALID_XATTR_BLOCK(ptr) \
477 (!strcmp((ptr)->xb_signature, OCFS2_XATTR_BLOCK_SIGNATURE))
478
476static inline unsigned long ino_from_blkno(struct super_block *sb, 479static inline unsigned long ino_from_blkno(struct super_block *sb,
477 u64 blkno) 480 u64 blkno)
478{ 481{
diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c
index e19980a71a3c..151ba6257fbb 100644
--- a/fs/ocfs2/xattr.c
+++ b/fs/ocfs2/xattr.c
@@ -555,14 +555,12 @@ static int ocfs2_xattr_block_list(struct inode *inode,
555 mlog_errno(ret); 555 mlog_errno(ret);
556 return ret; 556 return ret;
557 } 557 }
558 /*Verify the signature of xattr block*/
559 if (memcmp((void *)blk_bh->b_data, OCFS2_XATTR_BLOCK_SIGNATURE,
560 strlen(OCFS2_XATTR_BLOCK_SIGNATURE))) {
561 ret = -EFAULT;
562 goto cleanup;
563 }
564 558
565 xb = (struct ocfs2_xattr_block *)blk_bh->b_data; 559 xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
560 if (!OCFS2_IS_VALID_XATTR_BLOCK(xb)) {
561 ret = -EIO;
562 goto cleanup;
563 }
566 564
567 if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) { 565 if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) {
568 struct ocfs2_xattr_header *header = &xb->xb_attrs.xb_header; 566 struct ocfs2_xattr_header *header = &xb->xb_attrs.xb_header;
@@ -779,15 +777,14 @@ static int ocfs2_xattr_block_get(struct inode *inode,
779 mlog_errno(ret); 777 mlog_errno(ret);
780 return ret; 778 return ret;
781 } 779 }
782 /*Verify the signature of xattr block*/ 780
783 if (memcmp((void *)blk_bh->b_data, OCFS2_XATTR_BLOCK_SIGNATURE, 781 xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
784 strlen(OCFS2_XATTR_BLOCK_SIGNATURE))) { 782 if (!OCFS2_IS_VALID_XATTR_BLOCK(xb)) {
785 ret = -EFAULT; 783 ret = -EIO;
786 goto cleanup; 784 goto cleanup;
787 } 785 }
788 786
789 xs->xattr_bh = blk_bh; 787 xs->xattr_bh = blk_bh;
790 xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
791 788
792 if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) { 789 if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) {
793 xs->header = &xb->xb_attrs.xb_header; 790 xs->header = &xb->xb_attrs.xb_header;
@@ -1527,10 +1524,9 @@ static int ocfs2_xattr_free_block(struct inode *inode,
1527 goto out; 1524 goto out;
1528 } 1525 }
1529 1526
1530 /*Verify the signature of xattr block*/ 1527 xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
1531 if (memcmp((void *)blk_bh->b_data, OCFS2_XATTR_BLOCK_SIGNATURE, 1528 if (!OCFS2_IS_VALID_XATTR_BLOCK(xb)) {
1532 strlen(OCFS2_XATTR_BLOCK_SIGNATURE))) { 1529 ret = -EIO;
1533 ret = -EFAULT;
1534 goto out; 1530 goto out;
1535 } 1531 }
1536 1532
@@ -1540,7 +1536,6 @@ static int ocfs2_xattr_free_block(struct inode *inode,
1540 goto out; 1536 goto out;
1541 } 1537 }
1542 1538
1543 xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
1544 blk = le64_to_cpu(xb->xb_blkno); 1539 blk = le64_to_cpu(xb->xb_blkno);
1545 bit = le16_to_cpu(xb->xb_suballoc_bit); 1540 bit = le16_to_cpu(xb->xb_suballoc_bit);
1546 bg_blkno = ocfs2_which_suballoc_group(blk, bit); 1541 bg_blkno = ocfs2_which_suballoc_group(blk, bit);
@@ -1784,15 +1779,14 @@ static int ocfs2_xattr_block_find(struct inode *inode,
1784 mlog_errno(ret); 1779 mlog_errno(ret);
1785 return ret; 1780 return ret;
1786 } 1781 }
1787 /*Verify the signature of xattr block*/ 1782
1788 if (memcmp((void *)blk_bh->b_data, OCFS2_XATTR_BLOCK_SIGNATURE, 1783 xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
1789 strlen(OCFS2_XATTR_BLOCK_SIGNATURE))) { 1784 if (!OCFS2_IS_VALID_XATTR_BLOCK(xb)) {
1790 ret = -EFAULT; 1785 ret = -EIO;
1791 goto cleanup; 1786 goto cleanup;
1792 } 1787 }
1793 1788
1794 xs->xattr_bh = blk_bh; 1789 xs->xattr_bh = blk_bh;
1795 xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
1796 1790
1797 if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) { 1791 if (!(le16_to_cpu(xb->xb_flags) & OCFS2_XATTR_INDEXED)) {
1798 xs->header = &xb->xb_attrs.xb_header; 1792 xs->header = &xb->xb_attrs.xb_header;