Patch "cachefiles: wait for ondemand_object_worker to finish when dropping object" has been added to the 6.9-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

    cachefiles: wait for ondemand_object_worker to finish when dropping object

to the 6.9-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:
     cachefiles-wait-for-ondemand_object_worker-to-finish.patch
and it can be found in the queue-6.9 subdirectory.

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



commit 76085f8ae3157d42f87bb0b085a926a61b19d8b7
Author: Hou Tao <houtao1@xxxxxxxxxx>
Date:   Fri Jun 28 14:29:28 2024 +0800

    cachefiles: wait for ondemand_object_worker to finish when dropping object
    
    [ Upstream commit 12e009d60852f7bce0afc373ca0b320f14150418 ]
    
    When queuing ondemand_object_worker() to re-open the object,
    cachefiles_object is not pinned. The cachefiles_object may be freed when
    the pending read request is completed intentionally and the related
    erofs is umounted. If ondemand_object_worker() runs after the object is
    freed, it will incur use-after-free problem as shown below.
    
    process A  processs B  process C  process D
    
    cachefiles_ondemand_send_req()
    // send a read req X
    // wait for its completion
    
               // close ondemand fd
               cachefiles_ondemand_fd_release()
               // set object as CLOSE
    
                           cachefiles_ondemand_daemon_read()
                           // set object as REOPENING
                           queue_work(fscache_wq, &info->ondemand_work)
    
                                    // close /dev/cachefiles
                                    cachefiles_daemon_release
                                    cachefiles_flush_reqs
                                    complete(&req->done)
    
    // read req X is completed
    // umount the erofs fs
    cachefiles_put_object()
    // object will be freed
    cachefiles_ondemand_deinit_obj_info()
    kmem_cache_free(object)
                           // both info and object are freed
                           ondemand_object_worker()
    
    When dropping an object, it is no longer necessary to reopen the object,
    so use cancel_work_sync() to cancel or wait for ondemand_object_worker()
    to finish.
    
    Fixes: 0a7e54c1959c ("cachefiles: resend an open request if the read request's object is closed")
    Signed-off-by: Hou Tao <houtao1@xxxxxxxxxx>
    Signed-off-by: Baokun Li <libaokun1@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20240628062930.2467993-8-libaokun@xxxxxxxxxxxxxxx
    Acked-by: Jeff Layton <jlayton@xxxxxxxxxx>
    Reviewed-by: Jia Zhu <zhujia.zj@xxxxxxxxxxxxx>
    Reviewed-by: Gao Xiang <hsiangkao@xxxxxxxxxxxxxxxxx>
    Signed-off-by: Christian Brauner <brauner@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/cachefiles/ondemand.c b/fs/cachefiles/ondemand.c
index 1c0fa7412a6fa..6b94f616e6579 100644
--- a/fs/cachefiles/ondemand.c
+++ b/fs/cachefiles/ondemand.c
@@ -661,6 +661,9 @@ void cachefiles_ondemand_clean_object(struct cachefiles_object *object)
 		}
 	}
 	xa_unlock(&cache->reqs);
+
+	/* Wait for ondemand_object_worker() to finish to avoid UAF. */
+	cancel_work_sync(&object->ondemand->ondemand_work);
 }
 
 int cachefiles_ondemand_init_obj_info(struct cachefiles_object *object,




[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