• Brian Foster's avatar
    xfs: more robust recovery xlog buffer validation · 99c26595
    Brian Foster authored
    mkfs has a historical problem where it can format very small
    filesystems with too small of a physical log. Under certain
    conditions, log recovery of an associated filesystem can end up
    passing garbage parameter values to some of the cycle and log record
    verification functions due to bugs in log recovery not dealing with
    such filesystems properly. This results in attempts to read from
    bogus/underflowed log block addresses.
    
    Since the buffer read may ultimately succeed, log recovery can
    proceed with bogus data and otherwise go off the rails and crash.
    One example of this is a negative last_blk being passed to
    xlog_find_verify_log_record() causing us to skip the loop, pass a
    NULL head pointer to xlog_header_check_mount() and crash.
    
    Improve the xlog buffer verification to address this problem. We
    already verify xlog buffer length, so update this mechanism to also
    sanity check for a valid log relative block address and otherwise
    return an error. Pass a fixed, valid log block address from
    xlog_get_bp() since the target address will be validated when the
    buffer is read. This ensures that any bogus log block address/length
    calculations lead to graceful mount failure rather than risking a
    crash or worse if recovery proceeds with bogus data.
    Reported-by: default avatarZorro Lang <zlang@redhat.com>
    Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    99c26595
xfs_log_recover.c 162 KB