Commit e4fe082c authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

tools: ynl: make sure we always pass yarg to mnl_cb_run



There is one common error handler in ynl - ynl_cb_error().
It expects priv to be a pointer to struct ynl_parse_arg AKA yarg.
To avoid potential crashes if we encounter a stray NLMSG_ERROR
always pass yarg as priv (or a struct which has it as the first
member).

ynl_cb_null() has a similar problem directly - it expects yarg
but priv passed by the caller is ys.

Found by code inspection.

Fixes: 86878f14 ("tools: ynl: user space helpers")
Acked-by: default avatarNicolas Dichtel <nicolas.dichtel@6wind.com>
Link: https://lore.kernel.org/r/20240220161112.2735195-2-kuba@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 9990889b
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -466,6 +466,8 @@ ynl_gemsg_start_dump(struct ynl_sock *ys, __u32 id, __u8 cmd, __u8 version)

int ynl_recv_ack(struct ynl_sock *ys, int ret)
{
	struct ynl_parse_arg yarg = { .ys = ys, };

	if (!ret) {
		yerr(ys, YNL_ERROR_EXPECT_ACK,
		     "Expecting an ACK but nothing received");
@@ -478,7 +480,7 @@ int ynl_recv_ack(struct ynl_sock *ys, int ret)
		return ret;
	}
	return mnl_cb_run(ys->rx_buf, ret, ys->seq, ys->portid,
			  ynl_cb_null, ys);
			  ynl_cb_null, &yarg);
}

int ynl_cb_null(const struct nlmsghdr *nlh, void *data)
@@ -741,11 +743,14 @@ static int ynl_ntf_parse(struct ynl_sock *ys, const struct nlmsghdr *nlh)

static int ynl_ntf_trampoline(const struct nlmsghdr *nlh, void *data)
{
	return ynl_ntf_parse((struct ynl_sock *)data, nlh);
	struct ynl_parse_arg *yarg = data;

	return ynl_ntf_parse(yarg->ys, nlh);
}

int ynl_ntf_check(struct ynl_sock *ys)
{
	struct ynl_parse_arg yarg = { .ys = ys, };
	ssize_t len;
	int err;

@@ -767,7 +772,7 @@ int ynl_ntf_check(struct ynl_sock *ys)
			return len;

		err = mnl_cb_run2(ys->rx_buf, len, ys->seq, ys->portid,
				  ynl_ntf_trampoline, ys,
				  ynl_ntf_trampoline, &yarg,
				  ynl_cb_array, NLMSG_MIN_TYPE);
		if (err < 0)
			return err;