From nobody Mon Jan 20 20:54:07 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 4YcMyR5Bb4z5kwqk; Mon, 20 Jan 2025 20:54:07 +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 "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4YcMyR4VCGz44QP; Mon, 20 Jan 2025 20:54:07 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1737406447; 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=xkw+zh6SDp8ylxBNA4DNu1KWGyxuZh7ufrHXu03r68o=; b=YehUeWZpYmLCm0tFqhhpH3zrk+JYvoNfXFgiGPu5kxA++ysazAyFe/yW3dWNfHU3jR0wek Gin1k4wpSQBFKvrQELddF+h0ziDGZc82f3NtUrJrPNoqkcTaaYB8RnvTcA1P/GdxTx9Umh iMlqqdVYWND0viZMkWWCTMeotyg8ukDI6sC+BYyjxkL8E3/okHo506b3q45HHZmPJWbp6S vhiH9TSlu0UAhAnB7jwTzumXB4MJomuhyshD8Du5Rq6RaJsRenD3QWnidvd35nUJL7+6y+ sh7Lr5XcTL2HLEgajHkSHCa0PGXhxUSqQ4574NhqDJTBE0hGjsWrFuDAxC6YCw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1737406447; 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=xkw+zh6SDp8ylxBNA4DNu1KWGyxuZh7ufrHXu03r68o=; b=h/VPJhUySdViwROMKLzrCpT9pcrWwKHDyP91nC8HRjPnmr3TIZA9Lb6VZp041HgScUdqsv /5iU/ug2Ybv+BXjYjX/CmCaQgIqxLxpSW+o9U9f2MmbbSSdUSj0WJur7X+u612TmUiK4Z/ Ev1cy3ep+EvgKBI9gs/n1WPWR0ix8I7Fu3ZxduKPtq5OqIS+wg+FSViOGBObHA+8rj8wFK ZRFP1W8L+6RM7iGWvchfwcfV1eBkRKFE2m1CkYo/LSQysHYIUsFlcYb+XS0+6WsKZeK/Nl H5mF22rHPUO2WNqVJbci9mH8+idJeS+s1J4iMefGczIzlAqBx5Mz3N47UqPkMw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1737406447; a=rsa-sha256; cv=none; b=rhIu+xJOQZqYJisv+aYSDyWknXoNxsB58qewol18ycD7K4XjpyiDttdpOTyuKSON1BRsfj PMuWDIziNcNLwiYRWuGQgpoljD4VdIpk0ubVGckTPbR+P1xuYyV2oNFWGz0XXbk9zNTAn7 TkcHSCVh61VowhhbHEavxw0CGmoFKaU1agxwAXUiYuPJ0Q9LUsKKsPBJSXu9hPHdLAQVSM z/M6q3JwUoTEm6JhRkMY4E0jxR+ryzmy85xWlUt/rwF6YLnSodrySKnT1JKCXAGgmlRMkD u0cpN9T3WIIt5k2ZzEFdH2DVPtNdxCEfvFx99MrfcQasH4jggiSuf9mYIMNqbg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none 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 4YcMyR41ykzcqS; Mon, 20 Jan 2025 20:54:07 +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 50KKs7KF017524; Mon, 20 Jan 2025 20:54:07 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 50KKs7qh017521; Mon, 20 Jan 2025 20:54:07 GMT (envelope-from git) Date: Mon, 20 Jan 2025 20:54:07 GMT Message-Id: <202501202054.50KKs7qh017521@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Gleb Smirnoff Subject: git: f2a4eed3e13b - main - netlink: underscore snl_get_genl_family_info() to discourage its use 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: glebius X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: f2a4eed3e13b6aeb9ddeef580d3b931cf22a14e3 Auto-Submitted: auto-generated The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=f2a4eed3e13b6aeb9ddeef580d3b931cf22a14e3 commit f2a4eed3e13b6aeb9ddeef580d3b931cf22a14e3 Author: Gleb Smirnoff AuthorDate: 2025-01-20 20:53:37 +0000 Commit: Gleb Smirnoff CommitDate: 2025-01-20 20:53:37 +0000 netlink: underscore snl_get_genl_family_info() to discourage its use This function uses already supposedly opaque struct _getfamily_attrs as the argument and it fills it with pointers to volatile memory, which makes it is unsafe for general use. While here also underscore structures that hang off the struct _getfamily_attrs. Small programs like powerd(8) and RPC daemons are converted to use snl_get_genl_mcast_group() and/or snl_get_genl_family(). The genl(1) utility was fixed not to mix its own parsers with parsers declared in netlink_snl_generic.h. Reviewed by: melifaro Differential Revision: https://reviews.freebsd.org/D48480 --- sys/netlink/netlink_snl_generic.h | 36 +++++++++++++++++++++++------------- tests/sys/netlink/test_snl_generic.c | 2 +- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/sys/netlink/netlink_snl_generic.h b/sys/netlink/netlink_snl_generic.h index bdbefb914259..7dc8980e1c5c 100644 --- a/sys/netlink/netlink_snl_generic.h +++ b/sys/netlink/netlink_snl_generic.h @@ -60,17 +60,17 @@ static struct snl_field_parser snl_fp_genl[] = {}; #define SNL_DECLARE_GENL_PARSER(_name, _np) SNL_DECLARE_PARSER(_name,\ struct genlmsghdr, snl_fp_genl, _np) -struct snl_genl_ctrl_mcast_group { +struct _snl_genl_ctrl_mcast_group { uint32_t mcast_grp_id; const char *mcast_grp_name; }; -struct snl_genl_ctrl_mcast_groups { +struct _snl_genl_ctrl_mcast_groups { uint32_t num_groups; - struct snl_genl_ctrl_mcast_group **groups; + struct _snl_genl_ctrl_mcast_group **groups; }; -#define _OUT(_field) offsetof(struct snl_genl_ctrl_mcast_group, _field) +#define _OUT(_field) offsetof(struct _snl_genl_ctrl_mcast_group, _field) static struct snl_attr_parser _nla_p_getmc[] = { { .type = CTRL_ATTR_MCAST_GRP_NAME, @@ -85,12 +85,12 @@ static struct snl_attr_parser _nla_p_getmc[] = { }; #undef _OUT SNL_DECLARE_ATTR_PARSER_EXT(_genl_ctrl_mc_parser, - sizeof(struct snl_genl_ctrl_mcast_group), _nla_p_getmc, NULL); + sizeof(struct _snl_genl_ctrl_mcast_group), _nla_p_getmc, NULL); struct _getfamily_attrs { uint16_t family_id; const char *family_name; - struct snl_genl_ctrl_mcast_groups mcast_groups; + struct _snl_genl_ctrl_mcast_groups mcast_groups; }; #define _IN(_field) offsetof(struct genlmsghdr, _field) @@ -118,7 +118,7 @@ static struct snl_attr_parser _nla_p_getfam[] = { SNL_DECLARE_GENL_PARSER(_genl_ctrl_getfam_parser, _nla_p_getfam); static bool -snl_get_genl_family_info(struct snl_state *ss, const char *family_name, +_snl_get_genl_family_info(struct snl_state *ss, const char *family_name, struct _getfamily_attrs *attrs) { struct snl_writer nw; @@ -126,10 +126,16 @@ snl_get_genl_family_info(struct snl_state *ss, const char *family_name, memset(attrs, 0, sizeof(*attrs)); - snl_init_writer(ss, &nw); - hdr = snl_create_genl_msg_request(&nw, GENL_ID_CTRL, CTRL_CMD_GETFAMILY); - snl_add_msg_attr_string(&nw, CTRL_ATTR_FAMILY_NAME, family_name); - if ((hdr = snl_finalize_msg(&nw)) == NULL || !snl_send_message(ss, hdr)) + if (__predict_false(!snl_init_writer(ss, &nw))) + return (false); + if (__predict_false(snl_create_genl_msg_request(&nw, GENL_ID_CTRL, + CTRL_CMD_GETFAMILY) == NULL)) + return (false); + if (__predict_false(!snl_add_msg_attr_string(&nw, + CTRL_ATTR_FAMILY_NAME, family_name))) + return (false); + hdr = snl_finalize_msg(&nw); + if (!snl_send_message(ss, hdr)) return (false); hdr = snl_read_reply(ss, hdr->nlmsg_seq); @@ -146,7 +152,9 @@ snl_get_genl_family(struct snl_state *ss, const char *family_name) { struct _getfamily_attrs attrs = {}; - snl_get_genl_family_info(ss, family_name, &attrs); + if (__predict_false(!_snl_get_genl_family_info(ss, family_name, + &attrs))) + return (0); return (attrs.family_id); } @@ -156,7 +164,9 @@ snl_get_genl_mcast_group(struct snl_state *ss, const char *family_name, { struct _getfamily_attrs attrs = {}; - snl_get_genl_family_info(ss, family_name, &attrs); + if (__predict_false(!_snl_get_genl_family_info(ss, family_name, + &attrs))) + return (0); if (attrs.family_id == 0) return (0); if (family_id != NULL) diff --git a/tests/sys/netlink/test_snl_generic.c b/tests/sys/netlink/test_snl_generic.c index d84d3f88f487..839127fe5232 100644 --- a/tests/sys/netlink/test_snl_generic.c +++ b/tests/sys/netlink/test_snl_generic.c @@ -98,7 +98,7 @@ ATF_TC_BODY(test_snl_get_genl_family_groups, tc) ATF_CHECK(snl_parse_nlmsg(&ss, hdr, &_genl_ctrl_getfam_parser, &attrs)); ATF_CHECK_EQ(attrs.mcast_groups.num_groups, 1); - struct snl_genl_ctrl_mcast_group *group = attrs.mcast_groups.groups[0]; + struct _snl_genl_ctrl_mcast_group *group = attrs.mcast_groups.groups[0]; ATF_CHECK(group->mcast_grp_id > 0); ATF_CHECK(!strcmp(group->mcast_grp_name, "notify"));