From nobody Tue May 09 15:00:11 2023 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 4QG1Y72HF5z4BHnQ; Tue, 9 May 2023 15:00:11 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4QG1Y71mHqz3mR6; Tue, 9 May 2023 15:00:11 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1683644411; 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=9cgohhpbANKuViVa7abQ0CCOmlbgMWvPdfY0anmDP6c=; b=Pf+azUJAxSB6XdgCHeNkUV7Do2TRHgLDMoGlpcbntNYc6s5+6dk+nRvrSwVFdelERhhmaH O5dwQoTwqrF92SIp1xkDmZcDwP3Qalff+wcxqLZ176AEGtGbvmJAjCIPW3BxyZNWQIJ1fe 1iSFlhLwAalytF7rLzgaA6A4l1hLRufqCx8tBvlbjFExz3GaN4T82Atv2Ey/LAi5Q4Zw/O XEuwHdZ2adMARbdvw4g7QtloJFRZdAwga5G9KHLixyf0KEHmNHA7N/5t615zEzf55IqUPc KDWHEAhNZYDvPuW02I0aXFpOKnAC6w/V5yYiDf6JB8X333uOrbGTtl0qGI1QjQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1683644411; 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=9cgohhpbANKuViVa7abQ0CCOmlbgMWvPdfY0anmDP6c=; b=NoLc0tV2qWzPsdBIrCt0i+iPY9+nZLht80bx+hhWonb6hk05NrNU+NTXomUU1VLy2RrS4e YSgnd4h5KOvKb9Lref+7gh86/5mRVqP2KDUKrt0M0/9nB4WX+KciqOco7h6mNyqv8BQcN7 WPTozVkvscym9LVvHNv2p/98G+bvB8l8Wo5ekElwzgQ75Ynm9lXX11duyCfXttGdHNASOu kXiEO26o+FJ0jk3lwIzOErQT6lD07x1wLFTlD+sWtee74AVz3EU7LbcdqtBg3UQATMp/qp JYWzp0JqnA2Sg8D6U78yRM/F9+N3yXi6xSIb47tUtHLJt8lCY1J0IWEOqMcACg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1683644411; a=rsa-sha256; cv=none; b=oFGR2R0CHpusdX6TrFCRLbmMeyP4Jt5A2mgwnI1P6+crbcUeCiinWiZctkFEU4aWDcEeIH 5NqNltjeO1Fk6Re13dwtx9Pz4lO9oksA7fR27dK2ppDTtvqKWzLynQV9lF2HOd/BI6UO3R Kv/HtnJ2J+VkOHc117VZItSKfXek/ARbZy/41pZZhzD7mGpJq4dmndvbE/qxlmrPrFAocF K/TrR6LqNFi4uIrl5XuGF64ZYHxXIP81uU7Q9bgiQUjtEYDNMZMeK6xYTDzePYaychHRVc A8ShYtf0wc52mJQZkP5ql/F3trMLPaxokoTNNLxkAznS5tToVYamyxVp+Oy4lA== 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 4QG1Y70s2lzXDB; Tue, 9 May 2023 15:00:11 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 349F0BBs070674; Tue, 9 May 2023 15:00:11 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 349F0BY5070665; Tue, 9 May 2023 15:00:11 GMT (envelope-from git) Date: Tue, 9 May 2023 15:00:11 GMT Message-Id: <202305091500.349F0BY5070665@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: "Alexander V. Chernikov" Subject: git: ba9c815d3076 - main - netlink: use consistent variable lifetime in the default snl(3) parsers. 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: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: melifaro X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: ba9c815d3076f5a13ab6f9ec3f6d534e7774e83b Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by melifaro: URL: https://cgit.FreeBSD.org/src/commit/?id=ba9c815d3076f5a13ab6f9ec3f6d534e7774e83b commit ba9c815d3076f5a13ab6f9ec3f6d534e7774e83b Author: Alexander V. Chernikov AuthorDate: 2023-05-09 14:45:57 +0000 Commit: Alexander V. Chernikov CommitDate: 2023-05-09 14:45:57 +0000 netlink: use consistent variable lifetime in the default snl(3) parsers. Currently, parsers use original strings/nla pointers instead of duplicating them. These pointers refer to the temporary packet buffer, which can be silently rewritten when the next message is read. Instead, duplicate all string/nla attributes using snl_allocz(3) to give control over variable lifetime to the user. MFC after: 2 weeks --- sys/netlink/netlink_snl.h | 45 +++++++++++++++++++++++++++++++++ sys/netlink/netlink_snl_route_parsers.h | 16 ++++++------ 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/sys/netlink/netlink_snl.h b/sys/netlink/netlink_snl.h index 822cec9b4dc4..83892c156273 100644 --- a/sys/netlink/netlink_snl.h +++ b/sys/netlink/netlink_snl.h @@ -606,6 +606,23 @@ snl_attr_copy_string(struct snl_state *ss, struct nlattr *nla, return (false); } +static inline bool +snl_attr_dup_string(struct snl_state *ss __unused, struct nlattr *nla, + const void *arg __unused, void *target) +{ + size_t maxlen = NLA_DATA_LEN(nla); + + if (strnlen((char *)NLA_DATA(nla), maxlen) < maxlen) { + char *buf = snl_allocz(ss, maxlen); + if (buf == NULL) + return (false); + memcpy(buf, NLA_DATA(nla), maxlen); + *((char **)target) = buf; + return (true); + } + return (false); +} + static inline bool snl_attr_get_nested(struct snl_state *ss, struct nlattr *nla, const void *arg, void *target) { @@ -623,6 +640,20 @@ snl_attr_get_nla(struct snl_state *ss __unused, struct nlattr *nla, return (true); } +static inline bool +snl_attr_dup_nla(struct snl_state *ss __unused, struct nlattr *nla, + const void *arg __unused, void *target) +{ + void *ptr = snl_allocz(ss, nla->nla_len); + + if (ptr != NULL) { + memcpy(ptr, nla, nla->nla_len); + *((void **)target) = ptr; + return (true); + } + return (false); +} + static inline bool snl_attr_copy_struct(struct snl_state *ss, struct nlattr *nla, const void *arg __unused, void *target) @@ -637,6 +668,20 @@ snl_attr_copy_struct(struct snl_state *ss, struct nlattr *nla, return (false); } +static inline bool +snl_attr_dup_struct(struct snl_state *ss, struct nlattr *nla, + const void *arg __unused, void *target) +{ + void *ptr = snl_allocz(ss, NLA_DATA_LEN(nla)); + + if (ptr != NULL) { + memcpy(ptr, NLA_DATA(nla), NLA_DATA_LEN(nla)); + *((void **)target) = ptr; + return (true); + } + return (false); +} + static inline void snl_field_get_uint8(struct snl_state *ss __unused, void *src, void *target) { diff --git a/sys/netlink/netlink_snl_route_parsers.h b/sys/netlink/netlink_snl_route_parsers.h index 94dc20861c3f..1afbe3feeeb9 100644 --- a/sys/netlink/netlink_snl_route_parsers.h +++ b/sys/netlink/netlink_snl_route_parsers.h @@ -177,13 +177,13 @@ struct snl_parsed_link { #define _IN(_field) offsetof(struct ifinfomsg, _field) #define _OUT(_field) offsetof(struct snl_parsed_link, _field) static const struct snl_attr_parser _nla_p_link[] = { - { .type = IFLA_ADDRESS, .off = _OUT(ifla_address), .cb = snl_attr_get_nla }, - { .type = IFLA_BROADCAST, .off = _OUT(ifla_broadcast), .cb = snl_attr_get_nla }, - { .type = IFLA_IFNAME, .off = _OUT(ifla_ifname), .cb = snl_attr_get_string }, + { .type = IFLA_ADDRESS, .off = _OUT(ifla_address), .cb = snl_attr_dup_nla }, + { .type = IFLA_BROADCAST, .off = _OUT(ifla_broadcast), .cb = snl_attr_dup_nla }, + { .type = IFLA_IFNAME, .off = _OUT(ifla_ifname), .cb = snl_attr_dup_string }, { .type = IFLA_MTU, .off = _OUT(ifla_mtu), .cb = snl_attr_get_uint32 }, { .type = IFLA_OPERSTATE, .off = _OUT(ifla_operstate), .cb = snl_attr_get_uint8 }, - { .type = IFLA_IFALIAS, .off = _OUT(ifla_ifalias), .cb = snl_attr_get_string }, - { .type = IFLA_STATS64, .off = _OUT(ifla_stats64), .cb = snl_attr_copy_struct }, + { .type = IFLA_IFALIAS, .off = _OUT(ifla_ifalias), .cb = snl_attr_dup_string }, + { .type = IFLA_STATS64, .off = _OUT(ifla_stats64), .cb = snl_attr_dup_struct }, { .type = IFLA_PROMISCUITY, .off = _OUT(ifla_promiscuity), .cb = snl_attr_get_uint32 }, { .type = IFLA_CARRIER, .off = _OUT(ifla_carrier), .cb = snl_attr_get_uint8 }, }; @@ -208,7 +208,7 @@ struct snl_parsed_link_simple { #define _IN(_field) offsetof(struct ifinfomsg, _field) #define _OUT(_field) offsetof(struct snl_parsed_link_simple, _field) static struct snl_attr_parser _nla_p_link_s[] = { - { .type = IFLA_IFNAME, .off = _OUT(ifla_ifname), .cb = snl_attr_get_string }, + { .type = IFLA_IFNAME, .off = _OUT(ifla_ifname), .cb = snl_attr_dup_string }, { .type = IFLA_MTU, .off = _OUT(ifla_mtu), .cb = snl_attr_get_uint32 }, }; static struct snl_field_parser _fp_p_link_s[] = { @@ -240,7 +240,7 @@ SNL_DECLARE_ATTR_PARSER(_neigh_fbsd_parser, _nla_p_neigh_fbsd); static struct snl_attr_parser _nla_p_neigh_s[] = { { .type = NDA_DST, .off = _OUT(nda_dst), .cb = snl_attr_get_ip }, - { .type = NDA_LLADDR , .off = _OUT(nda_lladdr), .cb = snl_attr_get_nla }, + { .type = NDA_LLADDR , .off = _OUT(nda_lladdr), .cb = snl_attr_dup_nla }, { .type = NDA_PROBES, .off = _OUT(nda_probes), .cb = snl_attr_get_uint32 }, { .type = NDA_IFINDEX, .off = _OUT(nda_ifindex), .cb = snl_attr_get_uint32 }, { .type = NDA_FREEBSD, .arg = &_neigh_fbsd_parser, .cb = snl_attr_get_nested }, @@ -270,7 +270,7 @@ struct snl_parsed_addr { static struct snl_attr_parser _nla_p_addr_s[] = { { .type = IFA_ADDRESS, .off = _OUT(ifa_address), .cb = snl_attr_get_ip }, { .type = IFA_LOCAL, .off = _OUT(ifa_local), .cb = snl_attr_get_ip }, - { .type = IFA_LABEL, .off = _OUT(ifa_label), .cb = snl_attr_get_string }, + { .type = IFA_LABEL, .off = _OUT(ifa_label), .cb = snl_attr_dup_string }, { .type = IFA_BROADCAST, .off = _OUT(ifa_broadcast), .cb = snl_attr_get_ip }, }; static struct snl_field_parser _fp_p_addr_s[] = {