Patch "scsi: target: tcmu: Fix possible page UAF" has been added to the 4.14-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    scsi: target: tcmu: Fix possible page UAF

to the 4.14-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     scsi-target-tcmu-fix-possible-page-uaf.patch
and it can be found in the queue-4.14 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 2b3edb7652cd694868c745b59b6446a18c821587
Author: Xiaoguang Wang <xiaoguang.wang@xxxxxxxxxxxxxxxxx>
Date:   Fri Mar 11 21:22:05 2022 +0800

    scsi: target: tcmu: Fix possible page UAF
    
    [ Upstream commit a6968f7a367f128d120447360734344d5a3d5336 ]
    
    tcmu_try_get_data_page() looks up pages under cmdr_lock, but it does not
    take refcount properly and just returns page pointer. When
    tcmu_try_get_data_page() returns, the returned page may have been freed by
    tcmu_blocks_release().
    
    We need to get_page() under cmdr_lock to avoid concurrent
    tcmu_blocks_release().
    
    Link: https://lore.kernel.org/r/20220311132206.24515-1-xiaoguang.wang@xxxxxxxxxxxxxxxxx
    Reviewed-by: Bodo Stroesser <bostroesser@xxxxxxxxx>
    Signed-off-by: Xiaoguang Wang <xiaoguang.wang@xxxxxxxxxxxxxxxxx>
    Signed-off-by: Martin K. Petersen <martin.petersen@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c
index 96601fda47b1..f687481ccfdc 100644
--- a/drivers/target/target_core_user.c
+++ b/drivers/target/target_core_user.c
@@ -1165,6 +1165,7 @@ static struct page *tcmu_try_get_block_page(struct tcmu_dev *udev, uint32_t dbi)
 	mutex_lock(&udev->cmdr_lock);
 	page = tcmu_get_block_page(udev, dbi);
 	if (likely(page)) {
+		get_page(page);
 		mutex_unlock(&udev->cmdr_lock);
 		return page;
 	}
@@ -1233,6 +1234,7 @@ static int tcmu_vma_fault(struct vm_fault *vmf)
 		/* For the vmalloc()ed cmd area pages */
 		addr = (void *)(unsigned long)info->mem[mi].addr + offset;
 		page = vmalloc_to_page(addr);
+		get_page(page);
 	} else {
 		uint32_t dbi;
 
@@ -1243,7 +1245,6 @@ static int tcmu_vma_fault(struct vm_fault *vmf)
 			return VM_FAULT_NOPAGE;
 	}
 
-	get_page(page);
 	vmf->page = page;
 	return 0;
 }



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux