From nobody Sun Jul 5 23:04:29 2026 X-Original-To: dev-commits-src-all@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 4gtjjv2jQ9z6jg1Y for ; Sun, 05 Jul 2026 23:04:35 +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 "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gtjjv20Nbz3HSX for ; Sun, 05 Jul 2026 23:04:35 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1783292675; 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=zmK6jAbACvS1REST/w5I451/91E/Z3EQ31KcNkCOF2E=; b=HKgnf06L4l+dy3yTp3vh0HHGwIZo29AFFlsGvlDSgpAZlhEQQlICtXTUftUmzhWWJHE8RT /vFrsjAxFzy2900M1euP5RRo8cF6PJagHvcYwkQBEN2xfNKGQmZw+nN/KYtDU3gEIRv6oe lrNJ8TYWQ9IuQhZhx1xwfTwhWzlPyXn56A86oXYGObz8UXHCgDPG3ow4863K8naaUaC1nb 2XuGkHZby8ao3yWpy5KJsZvIvqiZFaom45bR9xI+llAQckKGk3Dy7UNVjGp1FBOugWGLiv zvkBTrSwDSIwlN4c1/2kYOiYmzyri6IdY99THxnDzmunyNrSNorbnN40iKMKDA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1783292675; a=rsa-sha256; cv=none; b=vgEPQ6xpWSIH+7pAf282NXgLbH83S5cAlXYg+kTuMgs0epf0nW2KAc5lJHjK5YXDL7D5ly XcRjgVL3iH0BIQOw+UGYqbUmm52vMVhI6pGc5Md0jP4aOVXcN3+eBaFAlrIJ8XF7DSe4cF BbumipO1TfOrlQz+GkG5XhcWWKhRYHkOVYQWOgDZNA4e5YPEtERlJhIpdDOo1mlqXJDJk1 3PBkNyXW87DWRoOMUi4TMwmfCYCviSI5NQ0/wCLT3hlNE7kcfPbZpq05+177i9waJnMDkn +JKTCfFX77PNiuYoiWrRviKksbO38GKVX7vnFDfhmsggCSHOyLt7Oy7+xE97aw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1783292675; 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=zmK6jAbACvS1REST/w5I451/91E/Z3EQ31KcNkCOF2E=; b=TZ00mkCLwY8eAwY1LM3fMYRW9i1EOh2mXMUiNqI7f1ylejU1n6fLhbIiBbhR1R6bLSXcmg LmMg4DEQsA+HN79eGB3blITJ1nmsC0y+iUdAmvfVa/jyiZ0SoZWkHjkvZYKxFR9PhCQ2YW rKJGoQIo+NzX0HEGT92s1At0nM5ndASxqP6nmSP4zQRMYWRK90XadrnUgrOWxvrBvD3HyY a9f0Ym0GR5QTR1pYZY7e4lalyfYeFuUy+BhTAwxbKIETXCVqJ7aGmNejiLDlbQsHnocvK9 Ad96r++gFblOrgJB1oeRF1yBz0R3vwn7CBxZgG5D2Ear3Fv3x7cJsb275ukrPA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gtjjv0ssZzfSx for ; Sun, 05 Jul 2026 23:04:35 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 247e3 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 05 Jul 2026 23:04:29 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Rick Macklem Subject: git: 0c48190463a5 - stable/15 - gss_impl.c: Fix a nfsd hang when the kgssapi.ko is loaded, but no gssd List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list 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/stable/15 X-Git-Reftype: branch X-Git-Commit: 0c48190463a5c895270be09c45b1471633ddd602 Auto-Submitted: auto-generated Date: Sun, 05 Jul 2026 23:04:29 +0000 Message-Id: <6a4ae2fd.247e3.17476bd2@gitrepo.freebsd.org> The branch stable/15 has been updated by rmacklem: URL: https://cgit.FreeBSD.org/src/commit/?id=0c48190463a5c895270be09c45b1471633ddd602 commit 0c48190463a5c895270be09c45b1471633ddd602 Author: Rick Macklem AuthorDate: 2026-06-21 23:15:23 +0000 Commit: Rick Macklem CommitDate: 2026-07-05 23:02:37 +0000 gss_impl.c: Fix a nfsd hang when the kgssapi.ko is loaded, but no gssd After the conversion to using netlink, the kgssapi had no way of knowing if the gssd daemon was running. As such, a boot where the kgssapi is loaded, but the gssd is not enabled would hang the nfsd for a very long time. (Many timeouts at 300sec each.) This patch adds a Null RPC upcall with a 200msec timeout to check to see if the gssd is running. If the gssd is not running, the nfsd starts up (without Kerberos support) with only a 200msec delay.) Also, move the svc_svc_nl_create() and svc_reg() calls in gssd.c to before the daemon() call, so they are guaranteed to have been done before the nfsd(8) daemon is started by the rc scripts. PR: 295714 (cherry picked from commit 455c354dd4dbba9b9ec9c68e335ab3aa46dca438) --- sys/kgssapi/gss_impl.c | 42 ++++++++++++++++++++++++++++++++++++++++-- usr.sbin/gssd/gssd.c | 22 +++++----------------- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/sys/kgssapi/gss_impl.c b/sys/kgssapi/gss_impl.c index 97b85a034071..4c7147fc3879 100644 --- a/sys/kgssapi/gss_impl.c +++ b/sys/kgssapi/gss_impl.c @@ -57,6 +57,7 @@ static int kgss_load(void) { CLIENT *cl; + struct timeval nulltimo = {.tv_sec = 0, .tv_usec = 200000}; LIST_INIT(&kgss_mechs); @@ -65,13 +66,16 @@ kgss_load(void) /* * The transport default is no retries at all, since there could - * be no userland listener to our messages. We will retry for 5 + * be no userland listener to our messages. Initially, a short timeout + * is set, so that a Null RPC upcall will fail quickly if the daemon + * is not running. After the Null RPC succeeds, we will retry for 5 * minutes with 10 second interval. This will potentially cure hosts * with misconfigured startup, where kernel starts sending GSS queries * before userland had started up the gssd(8) daemon. + * The initial timeout of 200usec is for the Null RPC. */ clnt_control(cl, CLSET_RETRIES, &(int){30}); - clnt_control(cl, CLSET_TIMEOUT, &(struct timeval){.tv_sec = 300}); + clnt_control(cl, CLSET_TIMEOUT, &nulltimo); /* * We literally wait on gssd(8), let's see that in top(1). @@ -237,9 +241,43 @@ CLIENT * kgss_gssd_client(void) { CLIENT *cl; + struct rpc_callextra ext; + enum clnt_stat stat; + struct timeval rpctimo = {.tv_sec = 300, .tv_usec = 0}; + static time_t nextrpc = 0; + static bool done_upcall = false; mtx_lock(&kgss_gssd_lock); cl = kgss_gssd_handle; + if (!done_upcall) { + mtx_unlock(&kgss_gssd_lock); + /* + * Can only be NULL if client_nl_create() called from + * kgss_load() returns NULL. + */ + if (cl == NULL) + return (cl); + if (time_uptime < nextrpc) + return (NULL); + /* + * Do a Null RPC with a short timeout. If the RPC succeeds, + * the gssd daemon is running. If the Null RPC fails, don't + * again for 5sec. + */ + memset(&ext, 0, sizeof(ext)); + ext.rc_auth = authnone_create(); + stat = clnt_call_private(cl, &ext, NULLPROC, + (xdrproc_t)xdr_void, NULL, (xdrproc_t)xdr_void, NULL, + rpctimo); /* rpctimo is ignored by clnt_nl_call(). */ + AUTH_DESTROY(ext.rc_auth); + if (stat != RPC_SUCCESS) { + nextrpc = time_uptime + 5; + return (NULL); + } + CLNT_CONTROL(cl, CLSET_TIMEOUT, &rpctimo); + mtx_lock(&kgss_gssd_lock); + done_upcall = true; + } if (cl != NULL) CLNT_ACQUIRE(cl); mtx_unlock(&kgss_gssd_lock); diff --git a/usr.sbin/gssd/gssd.c b/usr.sbin/gssd/gssd.c index 54d2062dd29a..5a00dbdd7c97 100644 --- a/usr.sbin/gssd/gssd.c +++ b/usr.sbin/gssd/gssd.c @@ -167,6 +167,11 @@ main(int argc, char **argv) gssd_load_mech(); + if ((xprt = svc_nl_create("kgss")) == NULL) + errx(1, "Can't create transport for local gssd socket"); + if (!svc_reg(xprt, GSSD, GSSDVERS, gssd_1, NULL)) + errx(1, "Can't register service for local gssd socket"); + if (!debug_level) { if (daemon(0, 0) != 0) err(1, "Can't daemonize"); @@ -177,23 +182,6 @@ main(int argc, char **argv) signal(SIGTERM, gssd_terminate); signal(SIGPIPE, gssd_terminate); - if ((xprt = svc_nl_create("kgss")) == NULL) { - if (debug_level == 0) { - syslog(LOG_ERR, - "Can't create transport for local gssd socket"); - exit(1); - } - err(1, "Can't create transport for local gssd socket"); - } - if (!svc_reg(xprt, GSSD, GSSDVERS, gssd_1, NULL)) { - if (debug_level == 0) { - syslog(LOG_ERR, - "Can't register service for local gssd socket"); - exit(1); - } - err(1, "Can't register service for local gssd socket"); - } - LIST_INIT(&gss_resources); gss_next_id = 1; gss_start_time = time(0);