From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3C5E028314A; Tue, 26 Aug 2025 14:13:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756217588; cv=none; b=S2Nw6nY2uyDuH9aABkEzm6AW47qvxyNnZIPRmVFEn5VeEROV4FMTOKKTUkYCwaALOVx9/xvGZFWsJwInLfuA8OmI2RZZWlJBpZRXuQfBLQc1n69I2+dnHbfNNfVTbsMbyT4RMjN1acoZQtAqEivKGOkNA5Qg19hx22dOKHDhL50= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756217588; c=relaxed/simple; bh=EkMIUuKtuhep+L6vYKB0bB6QxAqPr2fVYYH3u3t0G9o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=J6zzrw2r4n67jSVRt1ZQxE8pCBNeqe+dlYyswqbLfj/kSGB3JKXCAj5N18eT388fO9pKUIw29yMbJkktkTrnLB5ft5P46hXVJxwoJI5DCdABR1SRM/DMJ5vMVyEPaV1EdRSaKwIe+yqxi6LzUnQQmrwIJ1ZVvUB0QeLgf+oRqY8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linuxfoundation.org header.i=@linuxfoundation.org header.b=a2fz4L+a; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linuxfoundation.org header.i=@linuxfoundation.org header.b="a2fz4L+a" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BA010C4CEF1; Tue, 26 Aug 2025 14:13:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1756217588; bh=EkMIUuKtuhep+L6vYKB0bB6QxAqPr2fVYYH3u3t0G9o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=a2fz4L+aCuzFCt37QYuvNb6wEgLXPN3TEenUee2G+N4LHQbQmDL0a/1NRjJLy7Tgf MOWi9wLqgEeZAjfia9hT/BUYKjtviOhw6Wz4eehMN0gjNjN4FZlpm/P1nK4uOFmZ9z MdtgudlZ6lNAcFllJSLZc1fiFObMGcETDio4UTJQ= From: Greg Kroah-Hartman To: stable@vger.kernel.org Cc: Greg Kroah-Hartman , patches@lists.linux.dev, lei lu , Jeff Layton , Chuck Lever Subject: [PATCH 5.10 198/523] nfsd: handle get_client_locked() failure in nfsd4_setclientid_confirm() Date: Tue, 26 Aug 2025 13:06:48 +0200 Message-ID: <20250826110929.330984927@linuxfoundation.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250826110924.562212281@linuxfoundation.org> References: <20250826110924.562212281@linuxfoundation.org> User-Agent: quilt/0.68 X-stable: review X-Patchwork-Hint: ignore Precedence: bulk X-Mailing-List: patches@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 5.10-stable review patch. If anyone has any objections, please let me know. ------------------ From: Jeff Layton commit 908e4ead7f757504d8b345452730636e298cbf68 upstream. Lei Lu recently reported that nfsd4_setclientid_confirm() did not check the return value from get_client_locked(). a SETCLIENTID_CONFIRM could race with a confirmed client expiring and fail to get a reference. That could later lead to a UAF. Fix this by getting a reference early in the case where there is an extant confirmed client. If that fails then treat it as if there were no confirmed client found at all. In the case where the unconfirmed client is expiring, just fail and return the result from get_client_locked(). Reported-by: lei lu Closes: https://lore.kernel.org/linux-nfs/CAEBF3_b=UvqzNKdnfD_52L05Mqrqui9vZ2eFamgAbV0WG+FNWQ@mail.gmail.com/ Fixes: d20c11d86d8f ("nfsd: Protect session creation and client confirm using client_lock") Cc: stable@vger.kernel.org Signed-off-by: Jeff Layton Signed-off-by: Chuck Lever Signed-off-by: Greg Kroah-Hartman --- fs/nfsd/nfs4state.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -4284,10 +4284,16 @@ nfsd4_setclientid_confirm(struct svc_rqs } status = nfs_ok; if (conf) { - old = unconf; - unhash_client_locked(old); - nfsd4_change_callback(conf, &unconf->cl_cb_conn); - } else { + if (get_client_locked(conf) == nfs_ok) { + old = unconf; + unhash_client_locked(old); + nfsd4_change_callback(conf, &unconf->cl_cb_conn); + } else { + conf = NULL; + } + } + + if (!conf) { old = find_confirmed_client_by_name(&unconf->cl_name, nn); if (old) { status = nfserr_clid_inuse; @@ -4304,10 +4310,14 @@ nfsd4_setclientid_confirm(struct svc_rqs } trace_nfsd_clid_replaced(&old->cl_clientid); } + status = get_client_locked(unconf); + if (status != nfs_ok) { + old = NULL; + goto out; + } move_to_confirmed(unconf); conf = unconf; } - get_client_locked(conf); spin_unlock(&nn->client_lock); if (conf == unconf) fsnotify_dentry(conf->cl_nfsd_info_dentry, FS_MODIFY);