xfs: fix use after free in buf log item unlock assert
The xfs_buf_log_item ->iop_unlock() callback asserts that the buffer is unlocked when either non-stale or aborted. This assert occurs after the bli refcount has been dropped and the log item potentially freed. The aborted check is thus a potential use after free. This problem has been reproduced with KASAN enabled via generic/475. Fix up xfs_buf_item_unlock() to query aborted state before the bli reference is dropped to prevent a potential use after free. Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
dc4060a5dc
commit
4d09807f20
|
@ -605,6 +605,8 @@ xfs_buf_item_unlock(
|
|||
#if defined(DEBUG) || defined(XFS_WARN)
|
||||
bool ordered = bip->bli_flags & XFS_BLI_ORDERED;
|
||||
bool dirty = bip->bli_flags & XFS_BLI_DIRTY;
|
||||
bool aborted = test_bit(XFS_LI_ABORTED,
|
||||
&lip->li_flags);
|
||||
#endif
|
||||
|
||||
trace_xfs_buf_item_unlock(bip);
|
||||
|
@ -633,7 +635,7 @@ xfs_buf_item_unlock(
|
|||
released = xfs_buf_item_put(bip);
|
||||
if (hold || (stale && !released))
|
||||
return;
|
||||
ASSERT(!stale || test_bit(XFS_LI_ABORTED, &lip->li_flags));
|
||||
ASSERT(!stale || aborted);
|
||||
xfs_buf_relse(bp);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue