client: fix Dentry UAF by holding DentryRef across unlink
Hold a function-scoped DentryRef in Client::unlink() to keep the dentry alive through the entire teardown sequence. Without the O_DIRECTORY dentry pin (PR #60909, merged after v19.2.1), opening a directory does not call _ll_get(), so the dentry stays at ref=1 while inode->dir is still active. When trim_cache() evicts this dentry, Dentry::unlink() calls put() for the dir pin, ref drops to 0, and the dentry is freed while Client::unlink() still needs it for detach/lru_remove. A function-scoped DentryRef guarantees the dentry survives until after it has been properly removed from the dir and LRU, regardless of pin state. Signed-off-by: Igor Golikov <igolikov@ibm.com> Fixes: https://tracker.ceph.com/issues/74625
I
Igor Golikov committed
ad95bb54505161696e624646daee4eceec0a9d2e
Parent: 227b558
Committed by Venky Shankar <vshankar@redhat.com>
on 7/1/2026, 5:34:38 AM