From nobody Sun Sep 20 17:07:37 2026 X-Original-To: dev-commits-src-branches@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 4hnt8V4hDMz6sB8l for ; Sun, 20 Sep 2026 17:07:38 +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 4hnt8T6Zh6z4JZC for ; Sun, 20 Sep 2026 17:07:37 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1789924057; 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=RVjxWgDA+vAPETYCG0OINB345i+dftRERTMB9wj71k4=; b=lcAykEKHG09TECggrOO+UztVsj+lwZ52+iiRzBq0DkqxQAlZ9T9Bh6i2aHvwA0AgIJWEqt ESVOsqaj8sAhmQQwK1VofTb3NjvZQzBVCX6HKm6P8VAIfsDlkzDKVjC91R1+iC7IgmzpJv IfpPivL8+Yib/dNpRKg70OVPmJbk7TJCqCEuqT9fJXQpGOIj4XLYnkAbYDgHjX5X5zDZpS C852rtpLhyJ23RMx/M7vUN+OTJ6XAMsUGqFBRtD8wpDGZYGSe/qs1jWJzb2xLsN5XpeU7H p25P2qqQR5NKlTf3i4a4JcXFDCWZ91q+2LsK6oMb9YFRYvL6nZg7aNEvSKiqwQ== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1789924057; b=QRFlFIQk8z60R6+5Dhf6pRuHwKqFg4xZDRZbG40HN5s74Iyw3dcX+TidF/e6XmVFio6xhb OuL6jAD1MFpkEYM15O8F+M61zPzrd6Zzeh61O1CzcDbmSu5J5CLpxGxuTTEB6mdnUqr0xc LWO3zDk0G5PLcMYDVfnpLzzbYZGJGAQt//g/3mOJ9mjD6dFRsQjXAlmeqL0rErQ105jU3R Fr36zgBDnRK8rcRyHgRpb+/v98o253hRJ8iTHE3TQxG/t1RGtQvjLmFdqB0gT5kmsgy0cY e4cCw9vKS0W5R2LLE0iqHYUdSZXj5CNE8RPPPNPhrO5hnyQVOLICcSK7EsbueA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1789924057; 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=RVjxWgDA+vAPETYCG0OINB345i+dftRERTMB9wj71k4=; b=L2pxj+Ola/e4B7OvKIKrXf0sEUix50RtrATw2GaD5bQJxxytSJun2QT4rg3HIjT+9oVq0S 3RSdXnk0WeBaOj3kFZByMohF2X06u012Bg5OOhUsQ6sd+PaJhe4cdZyF6CbNFO5IvbHJaz 4qj2W5vZzcHERECX3U6QBq9hMQOIXpiBXAjJyycTvImUK9AujXdsI3adMgOWlraihIn7BI sfxgOoZD9k89WaSLd0c0156taBtTCzugCTPpe02ccsZz3zuiE/Or4v611vlyRE6104A1HE QuFx+NRR3DZdHxBzQ5AozuvldJCWUyiUhYygTi5RdaG++E2bKI7FcpISV2RI+g== 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 4hnt8T5SnbzkJG for ; Sun, 20 Sep 2026 17:07:37 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 30ff0 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 20 Sep 2026 17:07:37 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Dag-Erling=?utf-8?Q? Sm=C3=B8rg?=rav Subject: git: cd8eef45d2d0 - stable/15 - hastd: Use fixed-length protocol names List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@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: des X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: cd8eef45d2d0296afe0226bde587f52eb0404516 Auto-Submitted: auto-generated Date: Sun, 20 Sep 2026 17:07:37 +0000 Message-Id: <6ab012d9.30ff0.4a929570@gitrepo.freebsd.org> The branch stable/15 has been updated by des: URL: https://cgit.FreeBSD.org/src/commit/?id=cd8eef45d2d0296afe0226bde587f52eb0404516 commit cd8eef45d2d0296afe0226bde587f52eb0404516 Author: Dag-Erling Smørgrav AuthorDate: 2026-09-08 20:55:15 +0000 Commit: Dag-Erling Smørgrav CommitDate: 2026-09-20 16:51:12 +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. 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) --- 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 70166271a747..56cac566bad0 100644 --- a/sbin/hastd/proto.c +++ b/sbin/hastd/proto.c @@ -281,7 +281,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); @@ -293,11 +292,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; @@ -310,7 +307,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; @@ -321,10 +318,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); @@ -333,7 +328,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 59ac9553ff6e..31b657f17c32 100644 --- a/sbin/hastd/proto_socketpair.c +++ b/sbin/hastd/proto_socketpair.c @@ -219,7 +219,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,