sanity check attr fork size
PATCH 1/1 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.
fs/xfs/xfs_inode.c +13 -0
@@ -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 :
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Quoted 9 lines · Christoph Hellwig
Recently we have quite a few kerneloops reports about dereferencing a NULL
if_datain the attribute fork. From looking over the code this can only happen if we pass a 0 size argument toxfs_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_iformatto catch these early and without an oops.
Looks sane to me.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs