Commit 0a9b2c9f authored by Jeremy Kerr's avatar Jeremy Kerr Committed by Paolo Abeni
Browse files

net: mctp: use nlmsg_payload() for netlink message data extraction



Jakub suggests:

> I have a different request :) Matt, once this ends up in net-next
> (end of this week) could you refactor it to use nlmsg_payload() ?
> It doesn't exist in net but this is exactly why it was added.

This refactors the additions to both mctp_dump_addrinfo(), and
mctp_rtm_getneigh() - two cases where we're calling nlh_data() on an
an incoming netlink message, without a prior nlmsg_parse().

For the neigh.c case, we cannot hit the failure where the nlh does not
contain a full ndmsg at present, as the core handler
(net/core/neighbour.c, neigh_get()) has already validated the size
through neigh_valid_req_get(), and would have failed the get operation
before the MCTP hander is called.

However, relying on that is a bit fragile, so apply the nlmsg_payload
refector here too.

Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Signed-off-by: default avatarJeremy Kerr <jk@codeconstruct.com.au>
Link: https://patch.msgid.link/20250521-mctp-nlmsg-payload-v2-1-e85df160c405@codeconstruct.com.au


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 31eaaa5c
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -120,8 +120,8 @@ static int mctp_dump_addrinfo(struct sk_buff *skb, struct netlink_callback *cb)
	int ifindex = 0, rc;

	/* Filter by ifindex if a header is provided */
	if (cb->nlh->nlmsg_len >= nlmsg_msg_size(sizeof(*hdr))) {
		hdr = nlmsg_data(cb->nlh);
	hdr = nlmsg_payload(cb->nlh, sizeof(*hdr));
	if (hdr) {
		ifindex = hdr->ifa_index;
	} else {
		if (cb->strict_check) {
+4 −1
Original line number Diff line number Diff line
@@ -250,7 +250,10 @@ static int mctp_rtm_getneigh(struct sk_buff *skb, struct netlink_callback *cb)
		int idx;
	} *cbctx = (void *)cb->ctx;

	ndmsg = nlmsg_data(cb->nlh);
	ndmsg = nlmsg_payload(cb->nlh, sizeof(*ndmsg));
	if (!ndmsg)
		return -EINVAL;

	req_ifindex = ndmsg->ndm_ifindex;

	idx = 0;