From nobody Wed Jun 4 23:11:46 2025 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4bCNcz3RDDz5xnWV; Wed, 04 Jun 2025 23:11:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4bCNcz1GcZz3xjk; Wed, 04 Jun 2025 23:11:47 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1749078707; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=pE6MTL1S3HlSoUJhM16PGBbZm+FJOdKt/7Brbdsdpcs=; b=g0iwxqt8bnzO9AoHC6AsEtTekWgrOKazepNVtaZUYuBb5Zrmeu+YcOPjHZh9AaM32FBVTC FVIXRknfa+fmGbeGlMgvK4/FDePyVPnWV4SdIZ5cv3/X01MI3MT6Y3cGYFnAqbI6p5qDrS 94oxdwWcdQvlYu73bxjR8QxyJbq/Q38FISSPM4Owqt0wPElWjWa8O5k3SVwDJTGxKz1CQx WLdTUr5hCcUTqQLo7jnCZwBt5pCJbW8BfLheaT80VJ1lhhN5ujLHswi2hqKX+0DMqtBfsY XtiJLNDcW5hBUUhwJmHr/4u0f4O8aV5Gma5hjC0XsEbD8RfBE/XIu4umHp6k/A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1749078707; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=pE6MTL1S3HlSoUJhM16PGBbZm+FJOdKt/7Brbdsdpcs=; b=yEfbJUipdHHbg0V6BVpMSFiaaY3Nh3jEFfMuQ0Fp72+pbf5aULGOSmRonr6ewoa1EtcF8C eIeoJKKKsjfwPcTpM8mLD7Y4ZRmCPKvBrCLSa4Jg6Y5FXJLq/Tn0bduT6DlwlxyuaidUPl YIaMEQn3qO0OumMirh2ajQMj0zuIa9BXbv5GPcp1USGpClcmlPf1yr1pnaQfaZPpVozSDz Y+Ld3NmCFoFEl/gOMDyjCNC0A4xsMgvaPI/5/GQLqk4mXVbJ5y5+RvjXk2PTMWXjRgBwa5 ja0MlvAt1qkfk89KdFv5WfxeINU/yMyv9W0538xV4S/bFpWjY7MEQWouZ0KILQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1749078707; a=rsa-sha256; cv=none; b=Vzz7JzBBAu+lrhf8+o+nqOB7VXqZcqHUWuTzdDPDOZtzVakAGgVuPLMLgU3DeImbPEbMns LV57LSwyI+Qf4UgejYlAxNS11OiHNUFRiIrplSrPRVU84qbJyOWgS4qsFJdzrMro/jXUTp 1UdCsJTEXrzVaAKaW4Z/4nCV4KGgXGle9tknWnzZb5EcpbSkVz+ud8oPbGLC1MnorUZ1xC vr+te/u4iTOua3wG59VQHaEeiOEiipVNvRtrBalme1HmDhDKV8AsNyElHJ2Yv5S+HVPR5I PihTXl0b2Xe0gqu+aBCULJ9mZXv9zQIgdZgmyynZChvJBrcfjdRJ9qJFuXrxSg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4bCNcz0HwkzkJy; Wed, 04 Jun 2025 23:11:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 554NBkFL030289; Wed, 4 Jun 2025 23:11:46 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 554NBkRe030286; Wed, 4 Jun 2025 23:11:46 GMT (envelope-from git) Date: Wed, 4 Jun 2025 23:11:46 GMT Message-Id: <202506042311.554NBkRe030286@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Rick Macklem Subject: git: 1749465947a8 - main - nfsd: Fix accumulating nfslockfile structures List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: rmacklem X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 1749465947a807caa53ce09b90a30b820eaab62e Auto-Submitted: auto-generated The branch main has been updated by rmacklem: URL: https://cgit.FreeBSD.org/src/commit/?id=1749465947a807caa53ce09b90a30b820eaab62e commit 1749465947a807caa53ce09b90a30b820eaab62e Author: Rick Macklem AuthorDate: 2025-06-04 23:09:01 +0000 Commit: Rick Macklem CommitDate: 2025-06-04 23:09:01 +0000 nfsd: Fix accumulating nfslockfile structures If a NFSv4 client does an exclusive open where the file already exists, the server returns EEXIST. However, without this patch, a partially filled in nfslockfile structure is allocated, but is not referenced by any open and, as such, never gets freed. This patch fixes the bug by checking for EEXIST before calling nfsvno_open(). Reported by: Christoper Iler Tested by: Christoper Iler MFC after: 2 weeks --- sys/fs/nfsserver/nfs_nfsdserv.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c index b26fc59bcd6d..3f43e9115e28 100644 --- a/sys/fs/nfsserver/nfs_nfsdserv.c +++ b/sys/fs/nfsserver/nfs_nfsdserv.c @@ -2857,7 +2857,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram, int how = NFSCREATE_UNCHECKED; int32_t cverf[2], tverf[2] = { 0, 0 }; vnode_t vp = NULL, dirp = NULL; - struct nfsvattr nva, dirfor, diraft; + struct nfsvattr nva, dirfor, diraft, nva2; struct nameidata named; nfsv4stateid_t stateid, delegstateid; nfsattrbit_t attrbits; @@ -3107,11 +3107,23 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram, } break; case NFSCREATE_EXCLUSIVE: - exclusive_flag = 1; if (nd->nd_repstat == 0 && named.ni_vp == NULL) nva.na_mode = 0; - break; + /* FALLTHROUGH */ case NFSCREATE_EXCLUSIVE41: + if (nd->nd_repstat == 0 && named.ni_vp != NULL) { + nd->nd_repstat = nfsvno_getattr(named.ni_vp, + &nva2, nd, p, 1, NULL); + if (nd->nd_repstat == 0) { + tverf[0] = nva2.na_atime.tv_sec; + tverf[1] = nva2.na_atime.tv_nsec; + if (cverf[0] != tverf[0] || + cverf[1] != tverf[1])) + nd->nd_repstat = EEXIST; + } + if (nd->nd_repstat != 0) + done_namei = true; + } exclusive_flag = 1; break; } @@ -3201,16 +3213,8 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram, NFSACCCHK_VPISLOCKED, NULL); } - if (!nd->nd_repstat) { + if (!nd->nd_repstat) nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1, NULL); - if (!nd->nd_repstat) { - tverf[0] = nva.na_atime.tv_sec; - tverf[1] = nva.na_atime.tv_nsec; - } - } - if (!nd->nd_repstat && exclusive_flag && (cverf[0] != tverf[0] || - cverf[1] != tverf[1])) - nd->nd_repstat = EEXIST; /* * Do the open locking/delegation stuff. */