From nobody Mon Aug 4 19:46:50 2025 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 4bwnBM39G1z63Rcc; Mon, 04 Aug 2025 19:46: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 "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4bwnBL3QYyz4KWx; Mon, 04 Aug 2025 19:46:50 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754336810; 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=ZHfWJIKJY6hYf+YLGFyI3aX3t/GkcZLZ46GPUJqPMew=; b=eqZvoRGRoxBVAY4LP8LWYEiZr2GwqpnBXSqGiKE7R8F5BhyKJVh39eWueP2Wn2PwCMY//b IwuSqytuThzNYTAR6Z02QvzONqY0n5A2tXW+ucTJiRlgS5zz9NBe39ffaEYGAcfG5KjJZQ j894idHFTKbUEmc3vR1DcHpzifkF9OiFH4k63IMQFnQuUhmlrMAulWkFZgTuYFBKOXX588 egn9hOU4t6EMq/RYiNDsnEjblLIpLu5kRTUBdFF2MD/ZIK+dz6XR5k5JU/72G8A0NQhqwc lTERuInOor0L/SlVhcCZ9aP7IgKXJpJKesDyKpxvTNhTXBygV1sdBu+ybruGzQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754336810; 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=ZHfWJIKJY6hYf+YLGFyI3aX3t/GkcZLZ46GPUJqPMew=; b=cMLOaytMgmWPrRt1Jc0ZN6dbipqpSwyIyvya4LiYtuxo/gpsfLSHumEOYw+6RhfXpGd7IU Y6/aqjBCy7m0YzJxS54zhwUqjlFCaep47380gC4ZXxCDexaPBwTy9JD9xiWlnccBWkgGlX EM6tlVQBb/2/B7p5MmQ7ST9TUCwOuYSRHe1r3PdLXLb/pK92xBBZSLaziBbIFbNwMstaCs cBsAhGpSO9fa2kTTjYyJ4TgCTeK6FlIYlovmAlUyXc7yqJqhtOYCDW2KeTsN1B5oTOiteo iyjrW38wDvLEmhPx9r3BauXlu8G6m12mZAX+LbjmKIbZoVS9MapvPj8M8jHIkA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1754336810; a=rsa-sha256; cv=none; b=dHjBhVY3LiRY6T1CeAlOxsTp/rGl+EDtXJWYnnM3i216OcOnQSfudlxVXxbUfq0yRNPfjI RkIhKNZNr007ZrwYtxQlGRqoQenoLIcPKvDEa0Anma541DpFJtQPAO6J8Nn6zLWqdsLgJn HLaIY5BGh7P555vkuGnNzuXHWEbe3H58wpxc/CxufR1se8JIWPPXKDXRfjApJ89LEG4xKv 4zOWEzOLRzKIIPN0bmwRK8yKdbaIYt64SnexttUzpu1XBVDGU3h527W8BeV8AKOGngNkDj fVl7l6RUHPFwx/9CCMLTeBnFCk8Z5z7hST5iUVSaM1fxlsOTHQQw9gTTOW4v2w== 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 4bwnBL31lSz12Z7; Mon, 04 Aug 2025 19:46:50 +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 574JkoZa099134; Mon, 4 Aug 2025 19:46:50 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 574JkoWQ099131; Mon, 4 Aug 2025 19:46:50 GMT (envelope-from git) Date: Mon, 4 Aug 2025 19:46:50 GMT Message-Id: <202508041946.574JkoWQ099131@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: John Baldwin Subject: git: f61f75771f95 - main - ctld: Cleanups to parse_addr_port 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 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: f61f75771f95b59fdbc6ebd71b8da9407374ad44 Auto-Submitted: auto-generated The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=f61f75771f95b59fdbc6ebd71b8da9407374ad44 commit f61f75771f95b59fdbc6ebd71b8da9407374ad44 Author: John Baldwin AuthorDate: 2025-08-04 19:38:07 +0000 Commit: John Baldwin CommitDate: 2025-08-04 19:38:07 +0000 ctld: Cleanups to parse_addr_port - Reimplement the address parsing logic using std::string operations instead of C string parsing. - Return a freebsd::addrinfo_up instance holding the allocated struct addrinfo chain. Sponsored by: Chelsio Communications Pull Request: https://github.com/freebsd/freebsd-src/pull/1794 --- usr.sbin/ctld/ctld.cc | 73 ++++++++++++++++++++++++--------------------------- 1 file changed, 34 insertions(+), 39 deletions(-) diff --git a/usr.sbin/ctld/ctld.cc b/usr.sbin/ctld/ctld.cc index b2cf31fff18f..bf700d5b4051 100644 --- a/usr.sbin/ctld/ctld.cc +++ b/usr.sbin/ctld/ctld.cc @@ -506,51 +506,41 @@ portal_group_find(const struct conf *conf, const char *name) return (NULL); } -static int -parse_addr_port(char *arg, const char *def_port, struct addrinfo **ai) +static freebsd::addrinfo_up +parse_addr_port(const char *address, const char *def_port) { - struct addrinfo hints; - char *str, *addr, *ch; - const char *port; - int error, colons = 0; + struct addrinfo hints, *ai; + int error; - str = arg = strdup(arg); - if (arg[0] == '[') { + std::string addr(address); + std::string port(def_port); + if (addr[0] == '[') { /* * IPv6 address in square brackets, perhaps with port. */ - arg++; - addr = strsep(&arg, "]"); - if (arg == NULL) { - free(str); - return (1); - } - if (arg[0] == '\0') { - port = def_port; - } else if (arg[0] == ':') { - port = arg + 1; - } else { - free(str); - return (1); + addr.erase(0, 1); + size_t pos = addr.find(']'); + if (pos == 0 || pos == addr.npos) + return {}; + if (pos < addr.length() - 1) { + port = addr.substr(pos + 1); + if (port[0] != ':' || port.length() < 2) + return {}; + port.erase(0, 1); } + addr.resize(pos); } else { /* * Either IPv6 address without brackets - and without * a port - or IPv4 address. Just count the colons. */ - for (ch = arg; *ch != '\0'; ch++) { - if (*ch == ':') - colons++; - } - if (colons > 1) { - addr = arg; - port = def_port; - } else { - addr = strsep(&arg, ":"); - if (arg == NULL) - port = def_port; - else - port = arg; + size_t pos = addr.find(':'); + if (pos != addr.npos && addr.find(':', pos + 1) == addr.npos) { + /* Only a single colon at `pos`. */ + if (pos == addr.length() - 1) + return {}; + port = addr.substr(pos + 1); + addr.resize(pos); } } @@ -558,9 +548,10 @@ parse_addr_port(char *arg, const char *def_port, struct addrinfo **ai) hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; - error = getaddrinfo(addr, port, &hints, ai); - free(str); - return ((error != 0) ? 1 : 0); + error = getaddrinfo(addr.c_str(), port.c_str(), &hints, &ai); + if (error != 0) + return {}; + return freebsd::addrinfo_up(ai); } bool @@ -572,7 +563,8 @@ portal_group_add_portal(struct portal_group *pg, const char *value, bool iser) portal->p_listen = checked_strdup(value); portal->p_iser = iser; - if (parse_addr_port(portal->p_listen, "3260", &portal->p_ai)) { + freebsd::addrinfo_up ai = parse_addr_port(portal->p_listen, "3260"); + if (!ai) { log_warnx("invalid listen address %s", portal->p_listen); portal_delete(portal); return (false); @@ -583,6 +575,7 @@ portal_group_add_portal(struct portal_group *pg, const char *value, bool iser) * those into multiple portals. */ + portal->p_ai = ai.release(); return (true); } @@ -598,7 +591,8 @@ isns_new(struct conf *conf, const char *addr) TAILQ_INSERT_TAIL(&conf->conf_isns, isns, i_next); isns->i_addr = checked_strdup(addr); - if (parse_addr_port(isns->i_addr, "3205", &isns->i_ai)) { + freebsd::addrinfo_up ai = parse_addr_port(isns->i_addr, "3205"); + if (!ai) { log_warnx("invalid iSNS address %s", isns->i_addr); isns_delete(isns); return (false); @@ -609,6 +603,7 @@ isns_new(struct conf *conf, const char *addr) * those into multiple servers. */ + isns->i_ai = ai.release(); return (true); }