xfs: sanity check attr fork size

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Linux Kernel Mailing List
Date: Friday, April 3, 2009 - 11:06 am

Gitweb:     http://git.kernel.org/linus/2809f76afce05a73e08120f455107912aa519647
Commit:     2809f76afce05a73e08120f455107912aa519647
Parent:     7884bc8617e6b8afda8cb8853cf14abfd3148d5c
Author:     Christoph Hellwig <hch@lst.de>
AuthorDate: Mon Jan 19 02:04:16 2009 +0100
Committer:  Christoph Hellwig <hch@brick.lst.de>
CommitDate: Mon Jan 19 02:04:16 2009 +0100

    xfs: sanity check attr fork size
    
    Recently we have quite a few kerneloops reports about dereferencing a NULL
    if_data in the attribute fork.  From looking over the code this can only
    happen if we pass a 0 size argument to xfs_iformat_local.  This implies some
    sort of corruption and in fact the only mailinglist report about this from
    earlier this year was after a powerfail presumably on a system with write
    cache and without barriers.
    
    Add a quick sanity check for the attr fork size in xfs_iformat to catch
    these early and without an oops.
    
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Dave Chinner <david@fromorbit.com>
---
 fs/xfs/xfs_inode.c |   13 +++++++++++++
 1 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index be2ca4d..e7ae08d 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -424,6 +424,19 @@ xfs_iformat(
 	case XFS_DINODE_FMT_LOCAL:
 		atp = (xfs_attr_shortform_t *)XFS_DFORK_APTR(dip);
 		size = be16_to_cpu(atp->hdr.totsize);
+
+		if (unlikely(size < sizeof(struct xfs_attr_sf_hdr))) {
+			xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
+				"corrupt inode %Lu "
+				"(bad attr fork size %Ld).",
+				(unsigned long long) ip->i_ino,
+				(long long) size);
+			XFS_CORRUPTION_ERROR("xfs_iformat(8)",
+					     XFS_ERRLEVEL_LOW,
+					     ip->i_mount, dip);
+			return XFS_ERROR(EFSCORRUPTED);
+		}
+
 		error = xfs_iformat_local(ip, dip, XFS_ATTR_FORK, size);
 		break;
 	case XFS_DINODE_FMT_EXTENTS:
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
xfs: sanity check attr fork size, Linux Kernel Mailing ..., (Fri Apr 3, 11:06 am)