• B
    xfs: validate transaction header length on log recovery · 89cebc84
    Brian Foster 提交于
    When log recovery hits a new transaction, it copies the transaction
    header from the expected location in the log to the in-core structure
    using the length from the op record header. This length is validated to
    ensure it doesn't exceed the length of the record, but not against the
    expected size of a transaction header (and thus the size of the in-core
    structure). If the on-disk length is corrupted, the associated memcpy()
    can overflow, write to unrelated memory and lead to crashes. This has
    been reproduced via filesystem fuzzing.
    
    The code currently handles the possibility that the transaction header
    is split across two op records. Neither instance accounts for corruption
    where the op record length might be larger than the in-core transaction
    header. Update both sites to detect such corruption, warn and return an
    error from log recovery. Also add some comments and assert that if the
    record is split, the copy of the second portion is less than a full
    header. Otherwise, this suggests the copy of the second portion could
    have overwritten bits from the first and thus that something could be
    wrong.
    Signed-off-by: NBrian Foster <bfoster@redhat.com>
    Reviewed-by: NDave Chinner <dchinner@redhat.com>
    Signed-off-by: NDave Chinner <david@fromorbit.com>
    
    89cebc84
xfs_log_recover.c 128.6 KB