linux-stable/fs/fscache
Dave Wysochanski 37f0b459c9 fscache: Fix oops due to race with cookie_lru and use_cookie
[ Upstream commit b5b52de321 ]

If a cookie expires from the LRU and the LRU_DISCARD flag is set, but
the state machine has not run yet, it's possible another thread can call
fscache_use_cookie and begin to use it.

When the cookie_worker finally runs, it will see the LRU_DISCARD flag
set, transition the cookie->state to LRU_DISCARDING, which will then
withdraw the cookie.  Once the cookie is withdrawn the object is removed
the below oops will occur because the object associated with the cookie
is now NULL.

Fix the oops by clearing the LRU_DISCARD bit if another thread uses the
cookie before the cookie_worker runs.

  BUG: kernel NULL pointer dereference, address: 0000000000000008
  ...
  CPU: 31 PID: 44773 Comm: kworker/u130:1 Tainted: G     E    6.0.0-5.dneg.x86_64 #1
  Hardware name: Google Compute Engine/Google Compute Engine, BIOS Google 08/26/2022
  Workqueue: events_unbound netfs_rreq_write_to_cache_work [netfs]
  RIP: 0010:cachefiles_prepare_write+0x28/0x90 [cachefiles]
  ...
  Call Trace:
    netfs_rreq_write_to_cache_work+0x11c/0x320 [netfs]
    process_one_work+0x217/0x3e0
    worker_thread+0x4a/0x3b0
    kthread+0xd6/0x100

Fixes: 12bb21a29c ("fscache: Implement cookie user counting and resource pinning")
Reported-by: Daire Byrne <daire.byrne@gmail.com>
Signed-off-by: Dave Wysochanski <dwysocha@redhat.com>
Signed-off-by: David Howells <dhowells@redhat.com>
Tested-by: Daire Byrne <daire@dneg.com>
Link: https://lore.kernel.org/r/20221117115023.1350181-1-dwysocha@redhat.com/ # v1
Link: https://lore.kernel.org/r/20221117142915.1366990-1-dwysocha@redhat.com/ # v2
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-12-14 11:40:51 +01:00
..
Kconfig fscache: remove FSCACHE_OLD_API Kconfig option 2022-04-08 23:54:37 +01:00
Makefile fscache: Provide a means to begin an operation 2022-01-07 09:22:19 +00:00
cache.c fscache: Use wrapper fscache_set_cache_state() directly when relinquishing 2022-04-08 23:54:37 +01:00
cookie.c fscache: Fix oops due to race with cookie_lru and use_cookie 2022-12-14 11:40:51 +01:00
internal.h fscache: Move fscache_cookies_seq_ops specific code under CONFIG_PROC_FS 2022-04-08 23:54:37 +01:00
io.c fscache: Remove the cookie parameter from fscache_clear_page_bits() 2022-04-08 23:54:37 +01:00
main.c fscache: Implement cookie-level access helpers 2022-01-07 09:22:19 +00:00
proc.c fscache: Implement cookie registration 2022-01-07 09:22:19 +00:00
stats.c fscache, cachefiles: Display stat of culling events 2022-01-07 13:43:18 +00:00
volume.c fscache: fix OOB Read in __fscache_acquire_volume 2022-12-02 17:43:08 +01:00