Skip to content

Commit 65f9c4c

Browse files
orospkuba-moo
authored andcommitted
tools: ynl: fix string attribute length to include null terminator
The ynl_attr_put_str() function was not including the null terminator in the attribute length calculation. This caused kernel to reject CTRL_CMD_GETFAMILY requests with EINVAL: "Attribute failed policy validation". For a 4-character family name like "dpll": - Sent: nla_len=8 (4 byte header + 4 byte string without null) - Expected: nla_len=9 (4 byte header + 5 byte string with null) The bug was introduced in commit 15d2540 ("tools: ynl: check for overflow of constructed messages") when refactoring from stpcpy() to strlen(). The original code correctly included the null terminator: end = stpcpy(ynl_attr_data(attr), str); attr->nla_len = NLA_HDRLEN + NLA_ALIGN(end - (char *)ynl_attr_data(attr)); Since stpcpy() returns a pointer past the null terminator, the length included it. The refactored version using strlen() omitted the +1. The fix also removes NLA_ALIGN() from nla_len calculation, since nla_len should contain actual attribute length, not aligned length. Alignment is only for calculating next attribute position. This makes the code consistent with ynl_attr_put(). CTRL_ATTR_FAMILY_NAME uses NLA_NUL_STRING policy which requires null terminator. Kernel validates with memchr() and rejects if not found. Fixes: 15d2540 ("tools: ynl: check for overflow of constructed messages") Signed-off-by: Petr Oros <poros@redhat.com> Tested-by: Ivan Vecera <ivecera@redhat.com> Reviewed-by: Ivan Vecera <ivecera@redhat.com> Link: https://lore.kernel.org/20251018151737.365485-3-zahari.doychev@linux.com Link: https://patch.msgid.link/20251024132438.351290-1-poros@redhat.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 84a9052 commit 65f9c4c

1 file changed

Lines changed: 2 additions & 2 deletions

File tree

tools/net/ynl/lib/ynl-priv.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,15 +313,15 @@ ynl_attr_put_str(struct nlmsghdr *nlh, unsigned int attr_type, const char *str)
313313
struct nlattr *attr;
314314
size_t len;
315315

316-
len = strlen(str);
316+
len = strlen(str) + 1;
317317
if (__ynl_attr_put_overflow(nlh, len))
318318
return;
319319

320320
attr = (struct nlattr *)ynl_nlmsg_end_addr(nlh);
321321
attr->nla_type = attr_type;
322322

323323
strcpy((char *)ynl_attr_data(attr), str);
324-
attr->nla_len = NLA_HDRLEN + NLA_ALIGN(len);
324+
attr->nla_len = NLA_HDRLEN + len;
325325

326326
nlh->nlmsg_len += NLMSG_ALIGN(attr->nla_len);
327327
}

0 commit comments

Comments
 (0)