• Darrick J. Wong's avatar
    xfs: ensure inobt record walks always make forward progress · 27c14b5d
    Darrick J. Wong authored
    The aim of the inode btree record iterator function is to call a
    callback on every record in the btree.  To avoid having to tear down and
    recreate the inode btree cursor around every callback, it caches a
    certain number of records in a memory buffer.  After each batch of
    callback invocations, we have to perform a btree lookup to find the
    next record after where we left off.
    
    However, if the keys of the inode btree are corrupt, the lookup might
    put us in the wrong part of the inode btree, causing the walk function
    to loop forever.  Therefore, we add extra cursor tracking to make sure
    that we never go backwards neither when performing the lookup nor when
    jumping to the next inobt record.  This also fixes an off by one error
    where upon resume the lookup should have been for the inode /after/ the
    point at which we stopped.
    
    Found by fuzzing xfs/460 with keys[2].startino = ones causing bulkstat
    and quotacheck to hang.
    
    Fixes: a211432c ("xfs: create simplified inode walk function")
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Reviewed-by: default avatarChandan Babu R <chandanrlinux@gmail.com>
    27c14b5d
xfs_iwalk.c 19.7 KB