From nobody Wed May 20 14:29:39 2026 X-Original-To: dev-commits-src-main@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 4gLDSz6g1rz6dsdm for ; Wed, 20 May 2026 14:29:39 +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 "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gLDSz62Fkz3ZBH for ; Wed, 20 May 2026 14:29:39 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1779287379; 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=jpBs1yrcr8Vvbg1EcyWffNvYn9zyTT7tPYIm3UWLc+4=; b=oLLZsiAzVGgOKy4a0evgk29W/+NA4ea1R/8VLlR1gm93vYa2BcZN6nKi11U/9Flb3jueX7 l2SGJD1ENZ2oHQ8UsFMEgR5CivIKYTQkfPImun/FHn+f2t129TvEnyDMRFqHKBXslFLCOh tn8IJuzTt+d0tBX/a2E6KGbp6aYNX9eZvfg2NMmJnNFQcm0rkyxgmEtrTjIzmv8Ymj3WbP LolYQRg7s/0vKldGKibItP+Bb6Ji97PtC3tauUNJrTjQ1NP9TSHOjwnU8rtT5eCIqClqn3 VJUdvFAxQti9zStUm5Wvgzdo8rNp3/4/mGWGZz25kkIC2xz1ulz/usG+yed8yA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1779287379; a=rsa-sha256; cv=none; b=w12UIgEXS4lDRwsmEyqJaXckJgxZkIkOOjwSyPHHru7RubCDcy4qjjWSuNSZ3P76AmhPom blbmMJOxCmPnOLc6s1YLY/JjWEsKPdIEXqhBAofqegdeBF4gNI/ZNE+SaJbPSo3XE9/2W5 fzbeDystTi1bIkekDf7N66xoBc6NPYLeVMz2q0nhGtp7TLI8v3JK7oKqkOJohfj9uL5gui oN8N7n9or4ftDiUQKNdnxAIRe56GGI+bgZWm3q9qWJH7qIr+lyMQplwJjTd9PCenzkeI1w 1zc6KeKbl7JO4bBHLROBhnbpRjrlJsRvMRsScHKHtklbgW57Hjwg3F72Tv8+yg== 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=1779287379; 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=jpBs1yrcr8Vvbg1EcyWffNvYn9zyTT7tPYIm3UWLc+4=; b=w8L1Oewz6yeyiz3ZvnKVdnZG6N+M6VwEOuHEPzx6JMHAiB+mk0562mFXPY3d6VR6GoQ0Np Wh5qnOb6pWiHnjpPlEMtqGwRhcWQXP3BNMsL6Df/6qdHUSdz+7bi3uwZDhbaxR0HInG3kL UV8AIDW58dD+pJ+9VUcA2qn8GcEBzzqfagJhI8FHIf2cu5kz0ctreewfaPpV99gU9rYZUb m61lbst//elEAW5SCaFW7VwJM6bKMBVxp1ezeZnfx2scHfC1HhdfvTu3IkiGJWTbVhNGE1 0vbnOIKHGibu8co+bhgUfSrjJKOZ9bZC+6EPXEl3tnCUUnrKgfx+43zBvQ/fiQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gLDSz5NLRz14vl for ; Wed, 20 May 2026 14:29:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3f3cb by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 20 May 2026 14:29:39 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Gleb Smirnoff Subject: git: e145afc9eb91 - main - netlink: factor out compatibility code from inlined function List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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: glebius X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: e145afc9eb9187be7e7cfdd42043cefc07b6e8d6 Auto-Submitted: auto-generated Date: Wed, 20 May 2026 14:29:39 +0000 Message-Id: <6a0dc553.3f3cb.14b13c32@gitrepo.freebsd.org> The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=e145afc9eb9187be7e7cfdd42043cefc07b6e8d6 commit e145afc9eb9187be7e7cfdd42043cefc07b6e8d6 Author: Gleb Smirnoff AuthorDate: 2026-05-20 14:27:39 +0000 Commit: Gleb Smirnoff CommitDate: 2026-05-20 14:27:39 +0000 netlink: factor out compatibility code from inlined function This is a refactor of 228c632ab3f62. First, move compatibility one level up, where we yet work with the full header. Second, move this rarely executed code outside of the inline function. Should be no functional change. Reviewed by: pouria, melifaro Differential Revision: https://reviews.freebsd.org/D56915 --- sys/netlink/netlink_message_parser.c | 32 ++++++++++++++++++++++++++++++++ sys/netlink/netlink_message_parser.h | 29 ++++++++--------------------- 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/sys/netlink/netlink_message_parser.c b/sys/netlink/netlink_message_parser.c index 4c41235efaac..54aceb660a98 100644 --- a/sys/netlink/netlink_message_parser.c +++ b/sys/netlink/netlink_message_parser.c @@ -50,6 +50,38 @@ #include _DECLARE_DEBUG(LOG_INFO); +/* + * Some applications try to provide only the non-zero part of the required + * message header instead of a full one. It happens when fetching routes or + * interface addresses, where the first header byte is the family. + * This behavior is "illegal" under the "strict" Netlink socket option, however + * there are many applications out there doing things in the "old" way. + * Support this usecase by copying the provided bytes into the temporary + * zero-filled header and running the parser on this header instead. + */ +struct nlmsghdr * +nl_alloc_compat_hdr(struct nlmsghdr *hdr, uint32_t len, struct nl_pstate *npt) +{ + struct nlmsghdr *tmp; + + MPASS(hdr->nlmsg_len < sizeof(struct nlmsghdr) + len); + + len += sizeof(struct nlmsghdr); + if (npt->strict) { + nlmsg_report_err_msg(npt, + "header too short: expected %d, got %d", + len, hdr->nlmsg_len); + return (NULL); + } + tmp = npt_alloc(npt, len); + if (tmp == NULL) + return (NULL); + memcpy(tmp, hdr, hdr->nlmsg_len); + tmp->nlmsg_len = len; + + return (tmp); +} + bool nlmsg_report_err_msg(struct nl_pstate *npt, const char *fmt, ...) { diff --git a/sys/netlink/netlink_message_parser.h b/sys/netlink/netlink_message_parser.h index 720317ed74f3..8f61091c4a7f 100644 --- a/sys/netlink/netlink_message_parser.h +++ b/sys/netlink/netlink_message_parser.h @@ -222,6 +222,9 @@ bool nlmsg_report_err_offset(struct nl_pstate *npt, uint32_t off); void nlmsg_report_cookie(struct nl_pstate *npt, struct nlattr *nla); void nlmsg_report_cookie_u32(struct nl_pstate *npt, uint32_t val); +struct nlmsghdr *nl_alloc_compat_hdr(struct nlmsghdr *hdr, uint32_t len, + struct nl_pstate *npt); + /* * Have it inline so compiler can optimize field accesses into * the list of direct function calls without iteration. @@ -232,27 +235,7 @@ nl_parse_header(void *hdr, uint32_t len, const struct nlhdr_parser *parser, { int error; - if (__predict_false(len < parser->nl_hdr_off)) { - void *tmp_hdr; - - if (npt->strict) { - nlmsg_report_err_msg(npt, - "header too short: expected %d, got %d", - parser->nl_hdr_off, len); - return (EINVAL); - } - - /* - * Compatibility with older applications: - * pretend there's a full header. - */ - tmp_hdr = npt_alloc(npt, parser->nl_hdr_off); - if (tmp_hdr == NULL) - return (EINVAL); - memcpy(tmp_hdr, hdr, len); - hdr = tmp_hdr; - len = parser->nl_hdr_off; - } + MPASS(len >= parser->nl_hdr_off); if (npt->strict && parser->sp != NULL && !parser->sp(hdr, npt)) return (EINVAL); @@ -320,6 +303,10 @@ static inline int nl_parse_nlmsg(struct nlmsghdr *hdr, const struct nlhdr_parser *parser, struct nl_pstate *npt, void *target) { + if (__predict_false(hdr->nlmsg_len - sizeof(struct nlmsghdr) < + parser->nl_hdr_off) && + ((hdr = nl_alloc_compat_hdr(hdr, parser->nl_hdr_off, npt)) == NULL)) + return (ENOMEM); return (nl_parse_header(hdr + 1, hdr->nlmsg_len - sizeof(*hdr), parser, npt, target)); }