• Baokun Li's avatar
    cachefiles: add spin_lock for cachefiles_ondemand_info · 0a790040
    Baokun Li authored
    The following concurrency may cause a read request to fail to be completed
    and result in a hung:
    
               t1             |             t2
    ---------------------------------------------------------
                                cachefiles_ondemand_copen
                                  req = xa_erase(&cache->reqs, id)
    // Anon fd is maliciously closed.
    cachefiles_ondemand_fd_release
      xa_lock(&cache->reqs)
      cachefiles_ondemand_set_object_close(object)
      xa_unlock(&cache->reqs)
                                  cachefiles_ondemand_set_object_open
                                  // No one will ever close it again.
    cachefiles_ondemand_daemon_read
      cachefiles_ondemand_select_req
      // Get a read req but its fd is already closed.
      // The daemon can't issue a cread ioctl with an closed fd, then hung.
    
    So add spin_lock for cachefiles_ondemand_info to protect ondemand_id and
    state, thus we can avoid the above problem in cachefiles_ondemand_copen()
    by using ondemand_id to determine if fd has been closed.
    
    Fixes: c8383054 ("cachefiles: notify the user daemon when looking up cookie")
    Signed-off-by: default avatarBaokun Li <libaokun1@huawei.com>
    Link: https://lore.kernel.org/r/20240522114308.2402121-8-libaokun@huaweicloud.comAcked-by: default avatarJeff Layton <jlayton@kernel.org>
    Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
    0a790040
internal.h 16.2 KB