Skip to content
  • Dave Chinner's avatar
    xfs: fix intent use-after-free on abort · 0612d116
    Dave Chinner authored
    
    
    When an intent is aborted during it's initial commit through
    xfs_defer_trans_abort(), there is a use after free. The current
    report is for a RUI  through this path in generic/388:
    
     Freed by task 6274:
      __kasan_slab_free+0x136/0x180
      kmem_cache_free+0xe7/0x4b0
      xfs_trans_free_items+0x198/0x2e0
      __xfs_trans_commit+0x27f/0xcc0
      xfs_trans_roll+0x17b/0x2a0
      xfs_defer_trans_roll+0x6ad/0xe60
      xfs_defer_finish+0x2a6/0x2140
      xfs_alloc_file_space+0x53a/0xf90
      xfs_file_fallocate+0x5c6/0xac0
      vfs_fallocate+0x2f5/0x930
      ioctl_preallocate+0x1dc/0x320
      do_vfs_ioctl+0xfe4/0x1690
    
    The problem is that the RUI has two active references - one in the
    current transaction, and another held by the defer_ops structure
    that is passed to the RUD (intent done) so that both the intent and
    the intent done structures are freed on commit of the intent done.
    
    Hence during abort, we need to release the intent item, because the
    defer_ops reference is released separately via ->abort_intent
    callback. Fix all the intent code to do this correctly.
    
    Signed-Off-By: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    0612d116