From nobody Wed May 20 14:29:39 2026 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 4gLDT51dnLz6dsp8 for ; Wed, 20 May 2026 14:29:45 +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 4gLDT50rBVz3Zfm for ; Wed, 20 May 2026 14:29:45 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1779287385; 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=fjLYmEZfMx4QIBfBkUiNb+JiCUJNF0VzLXfLe2npFPFEnoJM9yIhUvXrt9mUYQevqQsuFV VpYX1NdsQz4qLBJ707scPu0jdsJbXxx8oln1tkSrILqcX/ce8tOW8lzpVvGsSPxSmsXXBv HvCMQbaBYPe2SF7JOecjVC3wB9pAPbv5ZuGip0DgoY5m/0c5OZ9w0gtBTYhFDgasrJ7fwD loEXM4/7oXhNP9pIYUs9oqAsTR0z5omGJogbCBEQ4Cyqx5fLgrTT7edPsykYwW914tvh8r cP+ac0zhCsWTRfLJCb/NEYPsxfnSFEnybQmlqq+BWbL7KjwiaCf1NdipQwFgrg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1779287385; a=rsa-sha256; cv=none; b=ORdz0qh4yGchPEpGI8ZiJi62a6cW5t1X5c3jLRmTK+VSdmsx6EpqiI4DsdGCe+BMxJxwRt VDVnVpJbEcj+njoWsimeD7kFYWlNn/QDrkevv3WZM6RntruTV1Ux0DsC7PKta0qoLsuXEK 8irfZjrdIb6Xq3hZKZCnarM+YiZ1OQiJ2C7ysODZTpN1Q2hkNLfIj2qN8iAf64ten9b/Lg XBn9u/daaT2LasuNFSnpYk3cfqCUzV1/2xO0GJtldfDry6FSGwf+nsRqHPh/VB7v/22/xR xchW8gLv6mtTsZKxV0Gn+LbbdEE3BuQy3FAbr4hhLYDkgs6rIUkE3QaLZTWhZg== 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=1779287385; 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=qqpV0P8MziVCIcuAO8PqQlYgfbwFSEVvUszri5/KyssmILTPH7g9wmHP+GpdoaAMHxbCn0 De0n8VC4mqhdGj++Cl/rMJHKIEso2ZvjhZ8ipGjEBJkxcmtzuPybBBu3OXh1v3LcQlPDGb ylcVp56NKI103rl8VwZw8CkXxMueC9pmZansCaw/0Gd80Lm0EMQL6su5XbGXQow81flZ5T 0ilYPYV8PgZnELZHZxKN4W+IpIa5GaEY+4AjpwrLJ2Aeqd2lB+n4Hr/BSyLuQ+UC2lOOEK 9WRVjxzMx5H8HX6Zw4xCq32223HcY1i8Rb+4NKvlfPKJFeBR3LikiFzWsX6ErA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gLDT507Wlz14dB for ; Wed, 20 May 2026 14:29:45 +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 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 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)); }