From nobody Wed Oct 14 16:03:50 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 4j4bbq3gJjz6vmYb for ; Wed, 14 Oct 2026 16:03:51 +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 "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4j4bbq0p0qz4Zjt for ; Wed, 14 Oct 2026 16:03:51 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791993831; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=8GNyjcmPbY/5eoyYgeb5eQVaOIlKDNzxyx+ckMXM5CU=; b=IZmro1+14WLq/L1OcLbNwqt64R7UMdsHZMVnGcV4d1AWQgqtdMyzOj5D35C1PUz/Jma1Q1 OK2xZRbka8kTVpJmhnHrVzZhFLy8SHmn+RhhvTVxf29aXNaT0kXEcT8zuUZIHau4c5si6A 4FB0GVvk0YLMRTiuy9t8y0lsR5EkXrz1hlwYO1bwsY1P4T0RErpkGDQxJ5JVLnKOiIs+wT CxxcgUftMmOT6bCxBMLxbrMOrWnValwG/N45Tmst0x5ttsQ7y6WJ+O8GiJYTnGLosTUWXD q/fl+24gvmLq0ApAldEKMeXitFHGTYfLj6Iu3DsgJ366xmxmh38JNpirko56Gw== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1791993831; b=MijmaMRw3YHyUGE5lVtv0Jm+KI0iTDZ9ZrFrWIylrZsXfkST+1+SwGJuxZSrTqg4uv1XOe XBdcJGAbEA81MTPVqjOCFaoNEtTHbePhD7fQLNBd2W3252vQACVLbhMnX7KAnd/rT6QK8V eQVcKmCSw+O/NzVq6LjsfLUpkV2v4mEpcTmc+BJXBwylLAIJ4A7k/rq5fTAv4dx37+/Gxu rCr0HqRVB7vZl0NiEexW0BUHu9f87ikTs8AWG2ij3fXUum21/BpCZxIxVTRg6j94PrVlCj Az21uKbb05vHTUgN8GuWVhC2K3dqqgA8Ywz28I20GNimks1G0Ujx3IhckFi0uQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791993831; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=8GNyjcmPbY/5eoyYgeb5eQVaOIlKDNzxyx+ckMXM5CU=; b=njExAwooDC17GNfDmUt+Va1Z5WzYGKKsYeiVZps5gwF94jKqRf0FiOAh4t/j59UKb06WY7 Lj5jn2L4OUT8q5Ahm/0iRquGlLtFEgEGRn7ET1juVIaE4bC1UjRZv5bTtaIhukxwdDxp1v TuqHi8D501h17mfkJA1bRPc9iPuxYWgZG2Hu7XNrcvbl8vbralFpMLq/nuHXyLF1L7x3yg AxU+ZAlf1vSpKNQ1/Oi/4sx9TmekZ0Rf0PwUzeD2Mga+7/9PGx4/yOoZFvVvMiZQIX8Xmz 4PDo7LJUPT3gCJMHM38Ls2xQZ1rzJ4dajui+SCFrIpypLfW2CqGmNK08vvY6Sg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4j4bbp67bHz189V for ; Wed, 14 Oct 2026 16:03:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 2755a by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 14 Oct 2026 16:03:50 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Cc: Dag-Erling=?utf-8?Q? Sm=C3=B8rg?=rav From: Mark Johnston Subject: git: 1c821dc49b53 - releng/14.4 - hastd: Use fixed-length protocol names List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: Commit messages for all branches of the src repository 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: markj X-Git-Repository: src X-Git-Refname: refs/heads/releng/14.4 X-Git-Reftype: branch X-Git-Commit: 1c821dc49b536cf2d925487324e0785a7a1400c6 Auto-Submitted: auto-generated Date: Wed, 14 Oct 2026 16:03:50 +0000 Message-Id: <6acfa7e6.2755a.50b8f55e@gitrepo.freebsd.org> The branch releng/14.4 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=1c821dc49b536cf2d925487324e0785a7a1400c6 commit 1c821dc49b536cf2d925487324e0785a7a1400c6 Author: Dag-Erling Smørgrav AuthorDate: 2026-09-08 20:55:15 +0000 Commit: Mark Johnston CommitDate: 2026-10-13 13:47:11 +0000 hastd: Use fixed-length protocol names All communication between hastd nodes and internally between hastd and its worker children passes through the same pair of send / receive functions. The receive function uses recv(2) with the MSG_WAITALL flag, which in theory means we should never get a short read. However, when handing off a socket to a worker child, we also pass a variable-length string identifying the type of socket we're passing, and reading this string relies on a short read. This used to work because the arrival of the descriptor would interrupt the recv(2) call, but this bug was fixed when the AF_UNIX code was rewritten a while ago and hastd has been broken ever since. Fixing the length of the protocol name to four characters including the terminating null solves the short-read bug by never requiring a short read (nothing else in hastd requires one). Note that this issue appears to have been reported independently first by Alessandro Sagratini in PR 292322 and then by Martin Vidovic in D57511. I ended up going in a different direction than Martin's patch, but his analysis was invaluable, hence the double credit below. Approved by: so Security: FreeBSD-EN-26:26.hastd PR: 292322 Reported by: Martin Vidovic MFC after: 1 week Event: EuroBSDcon DevSummit 2026 Reviewed by: xtronom_gmail.com, kevans, glebius, gjb Differential Revision: https://reviews.freebsd.org/D59521 (cherry picked from commit b7e5c2e008f5b441611830ad3a0329de0882419e) (cherry picked from commit 9401bfb06108e49cc125a237469886da34bb4f38) --- sbin/hastd/proto.c | 15 +++++---------- sbin/hastd/proto_impl.h | 2 +- sbin/hastd/proto_socketpair.c | 2 +- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/sbin/hastd/proto.c b/sbin/hastd/proto.c index 35f73bb8d0bf..a7548ae2709d 100644 --- a/sbin/hastd/proto.c +++ b/sbin/hastd/proto.c @@ -282,7 +282,6 @@ proto_recv(const struct proto_conn *conn, void *data, size_t size) int proto_connection_send(const struct proto_conn *conn, struct proto_conn *mconn) { - const char *protoname; int ret, fd; PJDLOG_ASSERT(conn != NULL); @@ -294,11 +293,9 @@ proto_connection_send(const struct proto_conn *conn, struct proto_conn *mconn) PJDLOG_ASSERT(mconn->pc_proto != NULL); fd = proto_descriptor(mconn); PJDLOG_ASSERT(fd >= 0); - protoname = mconn->pc_proto->prt_name; - PJDLOG_ASSERT(protoname != NULL); ret = conn->pc_proto->prt_send(conn->pc_ctx, - (const unsigned char *)protoname, strlen(protoname) + 1, fd); + mconn->pc_proto->prt_name, sizeof(mconn->pc_proto->prt_name), fd); proto_close(mconn); if (ret != 0) { errno = ret; @@ -311,7 +308,7 @@ int proto_connection_recv(const struct proto_conn *conn, bool client, struct proto_conn **newconnp) { - char protoname[128]; + char protoname[sizeof(conn->pc_proto->prt_name)]; struct proto *proto; struct proto_conn *newconn; int ret, fd; @@ -322,10 +319,8 @@ proto_connection_recv(const struct proto_conn *conn, bool client, PJDLOG_ASSERT(conn->pc_proto->prt_recv != NULL); PJDLOG_ASSERT(newconnp != NULL); - bzero(protoname, sizeof(protoname)); - - ret = conn->pc_proto->prt_recv(conn->pc_ctx, (unsigned char *)protoname, - sizeof(protoname) - 1, &fd); + ret = conn->pc_proto->prt_recv(conn->pc_ctx, protoname, + sizeof(protoname), &fd); if (ret != 0) { errno = ret; return (-1); @@ -334,7 +329,7 @@ proto_connection_recv(const struct proto_conn *conn, bool client, PJDLOG_ASSERT(fd >= 0); TAILQ_FOREACH(proto, &protos, prt_next) { - if (strcmp(proto->prt_name, protoname) == 0) + if (memcmp(proto->prt_name, protoname, sizeof(protoname)) == 0) break; } if (proto == NULL) { diff --git a/sbin/hastd/proto_impl.h b/sbin/hastd/proto_impl.h index 0a0074545f38..181a4cd4a17d 100644 --- a/sbin/hastd/proto_impl.h +++ b/sbin/hastd/proto_impl.h @@ -53,7 +53,7 @@ typedef void prt_remote_address_t(const void *, char *, size_t); typedef void prt_close_t(void *); struct proto { - const char *prt_name; + char prt_name[4]; prt_client_t *prt_client; prt_connect_t *prt_connect; prt_connect_wait_t *prt_connect_wait; diff --git a/sbin/hastd/proto_socketpair.c b/sbin/hastd/proto_socketpair.c index 9608eb13afff..ac0a86aacdd9 100644 --- a/sbin/hastd/proto_socketpair.c +++ b/sbin/hastd/proto_socketpair.c @@ -220,7 +220,7 @@ sp_close(void *ctx) } static struct proto sp_proto = { - .prt_name = "socketpair", + .prt_name = "skp", .prt_client = sp_client, .prt_send = sp_send, .prt_recv = sp_recv,