Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 45e7ae7f authored by Thomas Graf's avatar Thomas Graf Committed by David S. Miller
Browse files

[NETLINK]: Ignore control messages directly in netlink_run_queue()



Changes netlink_rcv_skb() to skip netlink controll messages and don't
pass them on to the message handler.

Signed-off-by: default avatarThomas Graf <tgraf@suug.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d35b6856
Loading
Loading
Loading
Loading
+0 −4
Original line number Original line Diff line number Diff line
@@ -864,10 +864,6 @@ rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, int *errp)


	type = nlh->nlmsg_type;
	type = nlh->nlmsg_type;


	/* A control message: ignore them */
	if (type < RTM_BASE)
		return 0;

	/* Unknown message: reply with EINVAL */
	/* Unknown message: reply with EINVAL */
	if (type > RTM_MAX)
	if (type > RTM_MAX)
		goto err_inval;
		goto err_inval;
+4 −0
Original line number Original line Diff line number Diff line
@@ -1479,6 +1479,10 @@ static int netlink_rcv_skb(struct sk_buff *skb, int (*cb)(struct sk_buff *,
		if (!(nlh->nlmsg_flags & NLM_F_REQUEST))
		if (!(nlh->nlmsg_flags & NLM_F_REQUEST))
			goto skip;
			goto skip;


		/* Skip control messages */
		if (nlh->nlmsg_type < NLMSG_MIN_TYPE)
			goto skip;

		if (cb(skb, nlh, &err) < 0) {
		if (cb(skb, nlh, &err) < 0) {
			/* Not an error, but we have to interrupt processing
			/* Not an error, but we have to interrupt processing
			 * here. Note: that in this case we do not pull
			 * here. Note: that in this case we do not pull
+0 −6
Original line number Original line Diff line number Diff line
@@ -304,9 +304,6 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,
	struct genlmsghdr *hdr = nlmsg_data(nlh);
	struct genlmsghdr *hdr = nlmsg_data(nlh);
	int hdrlen, err = -EINVAL;
	int hdrlen, err = -EINVAL;


	if (nlh->nlmsg_type < NLMSG_MIN_TYPE)
		goto ignore;

	family = genl_family_find_byid(nlh->nlmsg_type);
	family = genl_family_find_byid(nlh->nlmsg_type);
	if (family == NULL) {
	if (family == NULL) {
		err = -ENOENT;
		err = -ENOENT;
@@ -364,9 +361,6 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,
	*errp = err = ops->doit(skb, &info);
	*errp = err = ops->doit(skb, &info);
	return err;
	return err;


ignore:
	return 0;

errout:
errout:
	*errp = err;
	*errp = err;
	return -1;
	return -1;
+0 −4
Original line number Original line Diff line number Diff line
@@ -1860,10 +1860,6 @@ static int xfrm_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, int *err


	type = nlh->nlmsg_type;
	type = nlh->nlmsg_type;


	/* A control message: ignore them */
	if (type < XFRM_MSG_BASE)
		return 0;

	/* Unknown message: reply with EINVAL */
	/* Unknown message: reply with EINVAL */
	if (type > XFRM_MSG_MAX)
	if (type > XFRM_MSG_MAX)
		goto err_einval;
		goto err_einval;