• L
    dm thin metadata: check fail_io before using data_sm · cb65b282
    Li Lingfeng 提交于
    Must check pmd->fail_io before using pmd->data_sm since
    pmd->data_sm may be destroyed by other processes.
    
           P1(kworker)                             P2(message)
    do_worker
     process_prepared
      process_prepared_discard_passdown_pt2
       dm_pool_dec_data_range
                                        pool_message
                                         commit
                                          dm_pool_commit_metadata
                                            ↓
                                           // commit failed
                                          metadata_operation_failed
                                           abort_transaction
                                            dm_pool_abort_metadata
                                             __open_or_format_metadata
                                               ↓
                                              dm_sm_disk_open
                                                ↓
                                               // open failed
                                               // pmd->data_sm is NULL
        dm_sm_dec_blocks
          ↓
         // try to access pmd->data_sm --> UAF
    
    As shown above, if dm_pool_commit_metadata() and
    dm_pool_abort_metadata() fail in pool_message process, kworker may
    trigger UAF.
    
    Fixes: be500ed7 ("dm space maps: improve performance with inc/dec on ranges of blocks")
    Cc: stable@vger.kernel.org
    Signed-off-by: NLi Lingfeng <lilingfeng3@huawei.com>
    Signed-off-by: NMike Snitzer <snitzer@kernel.org>
    cb65b282
dm-thin-metadata.c 48.7 KB