From nobody Sat Jun 27 16:07:08 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 4gncr22sXbz6jmyG for ; Sat, 27 Jun 2026 16:07:14 +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 4gncr21sjTz3mQH for ; Sat, 27 Jun 2026 16:07:14 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1782576434; 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=rEa54uoeVdZpt9l2YeWbKkMki+5u5EG5KFpT4kHoREU=; b=XNuz2ZbOhZJcNHcdvg69aC/5cc2rFXe7oCUIXtx5ejnAG1qwwRJZ/vGs7JRrN65bW6qEOz cdINeoGWKYLh4KWy/+4DstiYhR639vNSIbJlRrS3z4uOkypj4bIcF0R9hWTMiUZirVT+VV rtx2Tkc1Dxzgy9XlgSRsoOQOO/3uxXh4/rmnOzNOG4+ZNpOKWzhrGysqQx9/yKQ7pACsQK 1IuqWjwoFHmbv5rWxMoDFhUmZ0sy3OtStxlPq2oijVNf7TkS+tQiIbWohS9YpgzO3vEkzx EvECkRqDG5QaB9/U3akjWs3xCSplpK+MKUynFiUaInUtPSlHUDFFS+lptuCR0w== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1782576434; a=rsa-sha256; cv=none; b=rcz/MMVmlRcYzVpLxOeW9LMMGAZA7eVnOYlQidZz5bmmvEpozZKLTlr6sMwfEBfFC2f+yw G1NvrLPfKItZ3lRTOb5ngy1y566qaznpo7y88uwQOlTuJvmAAcENG2Ugj4nxT9tydXmYlX 1ocmKCizsc26SLO2i6h6aGTqQJW6vCPApk9VXSSi1SFAUzs6t0aHSdEE7F80cW5XyYryfx HvrYg3+cMaN/bkvRkdiAjsvpC2nClgKjOk659NbmkMJ/I+7+HQqpkXllpX5koE2T3T7YHQ hMjfh4BtZDl42Y9Wz6s+fcs6GZPI3sLliAt1Yw0UoroEccbNepuVFaIcPXEWXg== 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=1782576434; 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=rEa54uoeVdZpt9l2YeWbKkMki+5u5EG5KFpT4kHoREU=; b=TwJxJMovFbnL77T0p2Ik8A9LS9sLAZmB4DhM9LjQYsb/xeVtGyVOsgTPfHKRlAMWcRTd51 S2geByJir8n6c4XNFGVdMn6+46yBFsmGZDucmV5vx4nPw40OkibsyIUsSt+0kvKTKW6h/i 5w5iTjtVEEJIJOxTGsw5zNkmBL6Ai4wi2KiqIO1YiXZOsvK9f2FwJrJq65l9jytJnVqmIj 2JolbAYB8M1UnA0Y92TPpZ979nbF3509/vVR1RBMjQmpOgxCrCpqxPNUjvKNAH6D+jy4WM SRY2ypfJxXb4Wzd/PIHpNHk4ctvcRNDEWUE9fAc8uI4Gr8zhLrmIHwoPCIYZ2w== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gncr201K1zWn4 for ; Sat, 27 Jun 2026 16:07:14 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 27764 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 27 Jun 2026 16:07:08 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: John Baldwin Subject: git: 4907d1c5c7f9 - main - ctld: Normalize physical port names 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: jhb X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 4907d1c5c7f97ca985611441df5871705b90030c Auto-Submitted: auto-generated Date: Sat, 27 Jun 2026 16:07:08 +0000 Message-Id: <6a3ff52c.27764.6a2746d4@gitrepo.freebsd.org> The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=4907d1c5c7f97ca985611441df5871705b90030c commit 4907d1c5c7f97ca985611441df5871705b90030c Author: John Baldwin AuthorDate: 2026-06-25 16:21:25 +0000 Commit: John Baldwin CommitDate: 2026-06-27 16:01:55 +0000 ctld: Normalize physical port names Don't require ioctl port names to be fully expanded as this contradicts the syntax documented in the ctl.conf(5). However, don't require users to exactly guess when pp or vp can be omitted. Instead, normalize all physical port names by parsing any port name with a pp or vp value and reformatting them to a standardized format. This format is also used when generating names for kernel-enumerated ports. Reported by: Seth Hoffert Fixes: caef3c50ac06 ("ctld: Refactor ioctl port handling") Sponsored by: Chelsio Communications --- usr.sbin/ctld/ctld.cc | 61 +++++++++++++++++++++++++++++++++++++++++-------- usr.sbin/ctld/kernel.cc | 5 +--- 2 files changed, 52 insertions(+), 14 deletions(-) diff --git a/usr.sbin/ctld/ctld.cc b/usr.sbin/ctld/ctld.cc index 834bef4ef363..19baa0486e44 100644 --- a/usr.sbin/ctld/ctld.cc +++ b/usr.sbin/ctld/ctld.cc @@ -53,6 +53,7 @@ #include #include +#include #include #include "conf.h" @@ -1378,17 +1379,55 @@ target::set_auth_type(const char *type) bool target::add_physical_port(std::string_view pport) { - /* Normalize ioctl port names. */ + /* Normalize port names. */ std::string pname; - if (pport.compare(0, strlen("ioctl/"), "ioctl/") == 0) { - int ret, pp, vp; - - pname = std::string(pport); - ret = sscanf(pname.c_str(), "ioctl/%d/%d", &pp, &vp); - if (ret == 2) { - pname = freebsd::stringf("ioctl/%d/%d", pp, vp); - pport = pname; + size_t pos = pport.find('/'); + if (pos == 0) { + log_warnx("invalid physical port \"%s\" for target " + "\"%s\"", std::string(pport).c_str(), name()); + return (false); + } + + if (pos != pport.npos) { + const char *pport_end = pport.data() + pport.size(); + int pp, vp; + + auto parse_int = [](const char *start, const char *end) -> int { + int value; + + if (start == end) + return -1; + + auto [ptr, ec] = std::from_chars(start, end, value); + if (ec != std::errc() || ptr != end) + return -1; + return value; + }; + + const char *ppstart = pport.data() + pos + 1; + size_t ppend = pport.find('/', pos + 1); + if (ppend == pport.npos) { + pp = parse_int(ppstart, pport_end); + vp = 0; + } else { + const char *vpstart = pport.data() + ppend + 1; + pp = parse_int(ppstart, pport.data() + ppend); + vp = parse_int(vpstart, pport_end); + } + + if (pp == -1 || vp == -1) { + log_warnx("invalid physical port \"%s\" for target " + "\"%s\"", std::string(pport).c_str(), name()); + return (false); + } + + pname = pport.substr(0, pos); + if (pp != 0 || vp != 0) { + pname += "/" + std::to_string(pp); + if (vp != 0) + pname += "/" + std::to_string(vp); } + pport = pname; } for (const auto &s : t_pports) { @@ -2679,7 +2718,9 @@ conf::add_pports(struct kports &kports) */ ret = sscanf(pport.c_str(), "ioctl/%d/%d", &i_pp, &i_vp); - if (ret == 2) { + if (ret > 0) { + if (ret == 1) + i_vp = 0; if (!add_port(targ, pport, i_pp, i_vp)) { log_warnx("can't create new port %s " "for %s", pport.c_str(), diff --git a/usr.sbin/ctld/kernel.cc b/usr.sbin/ctld/kernel.cc index f84440d64c23..188d01052a1c 100644 --- a/usr.sbin/ctld/kernel.cc +++ b/usr.sbin/ctld/kernel.cc @@ -559,10 +559,7 @@ conf_new_from_kernel(struct kports &kports) continue; std::string name = port.port_name; - if (port.port_frontend == "ioctl") - name += "/" + std::to_string(port.pp) + "/" + - std::to_string(port.vp); - else if (port.pp != 0 || port.vp != 0) { + if (port.pp != 0 || port.vp != 0) { name += "/" + std::to_string(port.pp); if (port.vp != 0) name += "/" + std::to_string(port.vp);