From nobody Mon Aug 4 19:46:41 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 4bwnBC1gydz63RcG; Mon, 04 Aug 2025 19:46:43 +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 4bwnB94fRKz4KDf; Mon, 04 Aug 2025 19:46:41 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754336801; 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=c51VTjYcUQvnKlFSRO+b2nxN2HLZAIx78eRwfjmpjhI=; b=UDoaMwZFaNN5lDp3UBh7vc7TZL4kSI8f0gyOmF/EAXGOWAmJ9WjtBz5315MLTrU2hHmSPF 5SJvxAHkRXIA/7FoS+fhglO3eqluZFhqKcLFuxbPO2eop44ZT04fwNX/S9HXY/gZIBpmIh VWDUc5RovEGDXj6dm2eIk8Ije+KA2fu4beExj5JrZDUV9TfuhUw6ngeXC9XRbpysmz8UBm 9gcOwedTgxX9Px5J+wkutMvnF4nF9l22yj1cl75TTYBQWANZXRpugD/EDhgOAQcmic57vB oaV+0JUzbcnJ3UdRpfJP42Get0FSCrD0ZeTEW2QXesWl++/SXs1o0N/LTt5/6g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754336801; 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=c51VTjYcUQvnKlFSRO+b2nxN2HLZAIx78eRwfjmpjhI=; b=YqADqU1NHL8btC5A9i3h0KBS5ftV6TtYRnuQJpb+KU7x46H5d3pGsbn0/ZH/NBPkWSX6B8 LdVmm7lEOKjzZPXmIiSLzqe/wh5PgYfEAmqFuxyAgvabfstdk21+7j2T3u106XPUzJQ29+ 70dkyen5vmKtJZGfzKxuiwQG3judeNQRKkpWYnj1dJINdbL8D+lUuklIw3loYgm2VoCHWr CjFe/aHjitqf52YD6Rjgsy75Bavop/fy9Y0KecIQiRINOe61ppWgVy8Iww7AXCJ8Xpy6Lk 3afBVLwR9cqjTxvLatoh6Dxtb90C+RXqUJl9JTBDazwIueRXHNYdv4LqpSs67A== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1754336801; a=rsa-sha256; cv=none; b=f7rz6VvnD+KPtLlK9FlEPPSBjetot2Gb4rQvWl8kXHfPJ5rsPkxLlVWsdX6qpoy8ifxGQM UGGrarSFhMYoaYJD5GvAVJfWdMqcdT2ztFQ5B/uoTNphWfL4xh6Bd+JfDm5VlAoZeUTnYm mu35JnM33UhrWn47KWitt+YJdCKrYzDLbyfHA45KvVp6tMFjbi0WHMTfPNJ/clPPidYCXb 1BK/Gxb/qCz1Z6j5F7pNVLo7fThKguJuiqBaVnucs4af2+1381RSmT2vVe0sSobDgTAaRp rtmCb/mQCV5fJIGCsQlRUz4j/aW66P3SVgUwfsWVFf/k4RCUG2meIFH0YcycLQ== 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 4bwnB93wPMz12qj; Mon, 04 Aug 2025 19:46:41 +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 574JkfM7098854; Mon, 4 Aug 2025 19:46:41 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 574JkfOf098851; Mon, 4 Aug 2025 19:46:41 GMT (envelope-from git) Date: Mon, 4 Aug 2025 19:46:41 GMT Message-Id: <202508041946.574JkfOf098851@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: 9a36ad4f5ada - main - ctld: Use scoped guards to finish configuration scopes in the UCL parser 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: 9a36ad4f5ada9a45492db0aea1a7cb1c77890192 Auto-Submitted: auto-generated The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=9a36ad4f5ada9a45492db0aea1a7cb1c77890192 commit 9a36ad4f5ada9a45492db0aea1a7cb1c77890192 Author: John Baldwin AuthorDate: 2025-08-04 19:38:06 +0000 Commit: John Baldwin CommitDate: 2025-08-04 19:38:06 +0000 ctld: Use scoped guards to finish configuration scopes in the UCL parser Sponsored by: Chelsio Communications Pull Request: https://github.com/freebsd/freebsd-src/pull/1794 --- usr.sbin/ctld/uclparse.cc | 181 +++++++++++++++++++++++----------------------- 1 file changed, 90 insertions(+), 91 deletions(-) diff --git a/usr.sbin/ctld/uclparse.cc b/usr.sbin/ctld/uclparse.cc index 722b045effb6..843e727a2e52 100644 --- a/usr.sbin/ctld/uclparse.cc +++ b/usr.sbin/ctld/uclparse.cc @@ -47,6 +47,16 @@ #include "conf.h" #include "ctld.hh" +struct scope_exit { + using callback = void(); + scope_exit(callback *fn) : fn(fn) {} + + ~scope_exit() { fn(); } + +private: + callback *fn; +}; + static bool uclparse_toplevel(const ucl::Ucl &); static bool uclparse_chap(const char *, const ucl::Ucl &); static bool uclparse_chap_mutual(const char *, const ucl::Ucl &); @@ -259,6 +269,7 @@ uclparse_target_lun(const char *t_name, const ucl::Ucl &obj) if (!target_start_lun(id)) return (false); + scope_exit finisher(lun_finish); std::string lun_name = freebsd::stringf("lun %u for target \"%s\"", id, t_name); return (uclparse_lun_entries(lun_name.c_str(), obj)); @@ -420,45 +431,46 @@ uclparse_auth_group(const char *name, const ucl::Ucl &top) if (!auth_group_start(name)) return (false); + scope_exit finisher(auth_group_finish); for (const auto &obj : top) { std::string key = obj.key(); if (key == "auth-type") { if (!auth_group_set_type(obj.string_value().c_str())) - goto fail; + return false; } if (key == "chap") { if (obj.type() == UCL_OBJECT) { if (!uclparse_chap(name, obj)) - goto fail; + return false; } else if (obj.type() == UCL_ARRAY) { for (const auto &tmp : obj) { if (!uclparse_chap(name, tmp)) - goto fail; + return false; } } else { log_warnx("\"chap\" property of auth-group " "\"%s\" is not an array or object", name); - goto fail; + return false; } } if (key == "chap-mutual") { if (obj.type() == UCL_OBJECT) { if (!uclparse_chap_mutual(name, obj)) - goto fail; + return false; } else if (obj.type() == UCL_ARRAY) { for (const auto &tmp : obj) { if (!uclparse_chap_mutual(name, tmp)) - goto fail; + return false; } } else { log_warnx("\"chap-mutual\" property of " "auth-group \"%s\" is not an array or object", name); - goto fail; + return false; } } @@ -466,18 +478,18 @@ uclparse_auth_group(const char *name, const ucl::Ucl &top) if (obj.type() == UCL_STRING) { if (!auth_group_add_initiator_name( obj.string_value().c_str())) - goto fail; + return false; } else if (obj.type() == UCL_ARRAY) { for (const auto &tmp : obj) { if (!auth_group_add_initiator_name( tmp.string_value().c_str())) - goto fail; + return false; } } else { log_warnx("\"initiator-name\" property of " "auth-group \"%s\" is not an array or string", name); - goto fail; + return false; } } @@ -485,27 +497,23 @@ uclparse_auth_group(const char *name, const ucl::Ucl &top) if (obj.type() == UCL_STRING) { if (!auth_group_add_initiator_portal( obj.string_value().c_str())) - goto fail; + return false; } else if (obj.type() == UCL_ARRAY) { for (const auto &tmp : obj) { if (!auth_group_add_initiator_portal( tmp.string_value().c_str())) - goto fail; + return false; } } else { log_warnx("\"initiator-portal\" property of " "auth-group \"%s\" is not an array or string", name); - goto fail; + return false; } } } - auth_group_finish(); return (true); -fail: - auth_group_finish(); - return (false); } static bool @@ -590,6 +598,7 @@ uclparse_portal_group(const char *name, const ucl::Ucl &top) if (!portal_group_start(name)) return (false); + scope_exit finisher(portal_group_finish); for (const auto &obj : top) { std::string key = obj.key(); @@ -598,12 +607,12 @@ uclparse_portal_group(const char *name, const ucl::Ucl &top) log_warnx("\"discovery-auth-group\" property " "of portal-group \"%s\" is not a string", name); - goto fail; + return false; } if (!portal_group_set_discovery_auth_group( obj.string_value().c_str())) - goto fail; + return false; } if (key == "discovery-filter") { @@ -611,12 +620,12 @@ uclparse_portal_group(const char *name, const ucl::Ucl &top) log_warnx("\"discovery-filter\" property of " "portal-group \"%s\" is not a string", name); - goto fail; + return false; } if (!portal_group_set_filter( obj.string_value().c_str())) - goto fail; + return false; } if (key == "foreign") { @@ -627,19 +636,19 @@ uclparse_portal_group(const char *name, const ucl::Ucl &top) if (obj.type() == UCL_STRING) { if (!portal_group_add_listen( obj.string_value().c_str(), false)) - goto fail; + return false; } else if (obj.type() == UCL_ARRAY) { for (const auto &tmp : obj) { if (!portal_group_add_listen( tmp.string_value().c_str(), false)) - goto fail; + return false; } } else { log_warnx("\"listen\" property of " "portal-group \"%s\" is not a string", name); - goto fail; + return false; } } @@ -647,19 +656,19 @@ uclparse_portal_group(const char *name, const ucl::Ucl &top) if (obj.type() == UCL_STRING) { if (!portal_group_add_listen( obj.string_value().c_str(), true)) - goto fail; + return false; } else if (obj.type() == UCL_ARRAY) { for (const auto &tmp : obj) { if (!portal_group_add_listen( tmp.string_value().c_str(), true)) - goto fail; + return false; } } else { log_warnx("\"listen\" property of " "portal-group \"%s\" is not a string", name); - goto fail; + return false; } } @@ -668,12 +677,12 @@ uclparse_portal_group(const char *name, const ucl::Ucl &top) log_warnx("\"offload\" property of " "portal-group \"%s\" is not a string", name); - goto fail; + return false; } if (!portal_group_set_offload( obj.string_value().c_str())) - goto fail; + return false; } if (key == "redirect") { @@ -681,26 +690,26 @@ uclparse_portal_group(const char *name, const ucl::Ucl &top) log_warnx("\"listen\" property of " "portal-group \"%s\" is not a string", name); - goto fail; + return false; } if (!portal_group_set_redirection( obj.string_value().c_str())) - goto fail; + return false; } if (key == "options") { if (obj.type() != UCL_OBJECT) { log_warnx("\"options\" property of portal group " "\"%s\" is not an object", name); - goto fail; + return false; } for (const auto &tmp : obj) { if (!portal_group_add_option( tmp.key().c_str(), tmp.forced_string_value().c_str())) - goto fail; + return false; } } @@ -709,7 +718,7 @@ uclparse_portal_group(const char *name, const ucl::Ucl &top) log_warnx("\"tag\" property of portal group " "\"%s\" is not an integer", name); - goto fail; + return false; } portal_group_set_tag(obj.int_value()); @@ -717,20 +726,16 @@ uclparse_portal_group(const char *name, const ucl::Ucl &top) if (key == "dscp") { if (!uclparse_dscp("portal", name, obj)) - goto fail; + return false; } if (key == "pcp") { if (!uclparse_pcp("portal", name, obj)) - goto fail; + return false; } } - portal_group_finish(); return (true); -fail: - portal_group_finish(); - return (false); } static bool @@ -739,6 +744,7 @@ uclparse_target(const char *name, const ucl::Ucl &top) if (!target_start(name)) return (false); + scope_exit finisher(target_finish); for (const auto &obj : top) { std::string key = obj.key(); @@ -746,67 +752,67 @@ uclparse_target(const char *name, const ucl::Ucl &top) if (obj.type() != UCL_STRING) { log_warnx("\"alias\" property of target " "\"%s\" is not a string", name); - goto fail; + return false; } if (!target_set_alias(obj.string_value().c_str())) - goto fail; + return false; } if (key == "auth-group") { if (obj.type() != UCL_STRING) { log_warnx("\"auth-group\" property of target " "\"%s\" is not a string", name); - goto fail; + return false; } if (!target_set_auth_group(obj.string_value().c_str())) - goto fail; + return false; } if (key == "auth-type") { if (obj.type() != UCL_STRING) { log_warnx("\"auth-type\" property of target " "\"%s\" is not a string", name); - goto fail; + return false; } if (!target_set_auth_type(obj.string_value().c_str())) - goto fail; + return false; } if (key == "chap") { if (obj.type() == UCL_OBJECT) { if (!uclparse_target_chap(name, obj)) - goto fail; + return false; } else if (obj.type() == UCL_ARRAY) { for (const auto &tmp : obj) { if (!uclparse_target_chap(name, tmp)) - goto fail; + return false; } } else { log_warnx("\"chap\" property of target " "\"%s\" is not an array or object", name); - goto fail; + return false; } } if (key == "chap-mutual") { if (obj.type() == UCL_OBJECT) { if (!uclparse_target_chap_mutual(name, obj)) - goto fail; + return false; } else if (obj.type() == UCL_ARRAY) { for (const auto &tmp : obj) { if (!uclparse_target_chap_mutual(name, tmp)) - goto fail; + return false; } } else { log_warnx("\"chap-mutual\" property of target " "\"%s\" is not an array or object", name); - goto fail; + return false; } } @@ -814,18 +820,18 @@ uclparse_target(const char *name, const ucl::Ucl &top) if (obj.type() == UCL_STRING) { if (!target_add_initiator_name( obj.string_value().c_str())) - goto fail; + return false; } else if (obj.type() == UCL_ARRAY) { for (const auto &tmp : obj) { if (!target_add_initiator_name( tmp.string_value().c_str())) - goto fail; + return false; } } else { log_warnx("\"initiator-name\" property of " "target \"%s\" is not an array or string", name); - goto fail; + return false; } } @@ -833,18 +839,18 @@ uclparse_target(const char *name, const ucl::Ucl &top) if (obj.type() == UCL_STRING) { if (!target_add_initiator_portal( obj.string_value().c_str())) - goto fail; + return false; } else if (obj.type() == UCL_ARRAY) { for (const auto &tmp : obj) { if (!target_add_initiator_portal( tmp.string_value().c_str())) - goto fail; + return false; } } else { log_warnx("\"initiator-portal\" property of " "target \"%s\" is not an array or string", name); - goto fail; + return false; } } @@ -853,11 +859,11 @@ uclparse_target(const char *name, const ucl::Ucl &top) for (const auto &tmp : obj) { if (!uclparse_target_portal_group(name, tmp)) - goto fail; + return false; } } else { if (!uclparse_target_portal_group(name, obj)) - goto fail; + return false; } } @@ -865,37 +871,33 @@ uclparse_target(const char *name, const ucl::Ucl &top) if (obj.type() != UCL_STRING) { log_warnx("\"port\" property of target " "\"%s\" is not a string", name); - goto fail; + return false; } if (!target_set_physical_port(obj.string_value().c_str())) - goto fail; + return false; } if (key == "redirect") { if (obj.type() != UCL_STRING) { log_warnx("\"redirect\" property of target " "\"%s\" is not a string", name); - goto fail; + return false; } if (!target_set_redirection(obj.string_value().c_str())) - goto fail; + return false; } if (key == "lun") { for (const auto &tmp : obj) { if (!uclparse_target_lun(name, tmp)) - goto fail; + return false; } } } - target_finish(); return (true); -fail: - target_finish(); - return (false); } static bool @@ -904,6 +906,7 @@ uclparse_lun(const char *name, const ucl::Ucl &top) if (!lun_start(name)) return (false); + scope_exit finisher(lun_finish); std::string lun_name = freebsd::stringf("lun \"%s\"", name); return (uclparse_lun_entries(lun_name.c_str(), top)); } @@ -918,68 +921,68 @@ uclparse_lun_entries(const char *name, const ucl::Ucl &top) if (obj.type() != UCL_STRING) { log_warnx("\"backend\" property of %s " "is not a string", name); - goto fail; + return false; } if (!lun_set_backend(obj.string_value().c_str())) - goto fail; + return false; } if (key == "blocksize") { if (obj.type() != UCL_INT) { log_warnx("\"blocksize\" property of %s " "is not an integer", name); - goto fail; + return false; } if (!lun_set_blocksize(obj.int_value())) - goto fail; + return false; } if (key == "device-id") { if (obj.type() != UCL_STRING) { log_warnx("\"device-id\" property of %s " "is not an integer", name); - goto fail; + return false; } if (!lun_set_device_id(obj.string_value().c_str())) - goto fail; + return false; } if (key == "device-type") { if (obj.type() != UCL_STRING) { log_warnx("\"device-type\" property of %s " "is not an integer", name); - goto fail; + return false; } if (!lun_set_device_type(obj.string_value().c_str())) - goto fail; + return false; } if (key == "ctl-lun") { if (obj.type() != UCL_INT) { log_warnx("\"ctl-lun\" property of %s " "is not an integer", name); - goto fail; + return false; } if (!lun_set_ctl_lun(obj.int_value())) - goto fail; + return false; } if (key == "options") { if (obj.type() != UCL_OBJECT) { log_warnx("\"options\" property of %s " "is not an object", name); - goto fail; + return false; } for (const auto &child : obj) { if (!lun_add_option(child.key().c_str(), child.forced_string_value().c_str())) - goto fail; + return false; } } @@ -987,41 +990,37 @@ uclparse_lun_entries(const char *name, const ucl::Ucl &top) if (obj.type() != UCL_STRING) { log_warnx("\"path\" property of %s " "is not a string", name); - goto fail; + return false; } if (!lun_set_path(obj.string_value().c_str())) - goto fail; + return false; } if (key == "serial") { if (obj.type() != UCL_STRING) { log_warnx("\"serial\" property of %s " "is not a string", name); - goto fail; + return false; } if (!lun_set_serial(obj.string_value().c_str())) - goto fail; + return false; } if (key == "size") { if (obj.type() != UCL_INT) { log_warnx("\"size\" property of %s " "is not an integer", name); - goto fail; + return false; } if (!lun_set_size(obj.int_value())) - goto fail; + return false; } } - lun_finish(); return (true); -fail: - lun_finish(); - return (false); } bool