Re: [PATCH 02/13] IP set core support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Am 31.01.2011 23:52, schrieb Jozsef Kadlecsik:
> +static int
> +call_ad(struct sk_buff *skb, struct ip_set *set,
> +	struct nlattr *tb[], enum ipset_adt adt,
> +	u32 flags, bool use_lineno)
> +{
> +	int ret, retried = 0;
> +	u32 lineno = 0;
> +	bool eexist = flags & IPSET_FLAG_EXIST;
> +
> +	do {
> +		write_lock_bh(&set->lock);
> +		ret = set->variant->uadt(set, tb, adt, &lineno, flags);
> +		write_unlock_bh(&set->lock);
> +	} while (ret == -EAGAIN &&
> +		 set->variant->resize &&
> +		 (ret = set->variant->resize(set, retried++)) == 0);
> +
> +	if (!ret || (ret == -IPSET_ERR_EXIST && eexist))
> +		return 0;
> +	if (lineno && use_lineno) {
> +		/* Error in restore/batch mode: send back lineno */
> +		struct nlmsghdr *nlh = nlmsg_hdr(skb);
> +		int min_len = NLMSG_SPACE(sizeof(struct nfgenmsg));
> +		struct nlattr *cda[IPSET_ATTR_CMD_MAX+1];
> +		struct nlattr *cmdattr = (void *)nlh + min_len;
> +		u32 *errline;
> +
> +		nla_parse(cda, IPSET_ATTR_CMD_MAX,
> +			  cmdattr, nlh->nlmsg_len - min_len,
> +			  ip_set_adt_policy);
> +
> +		errline = nla_data(cda[IPSET_ATTR_LINENO]);
> +
> +		*errline = lineno;

This is still not correct. I didn't mean to remove the const attributes
(the message is still considered const by the higher layers, the netlink
functions just cast this away). You're modifying the received message,
I don't see how this can be useful to userspace.

I guess you're relying on that the original message is appended to a
nlmsgerr message. That doesn't seem right though, if you want to return
something to userspace, you should construct a new message.

> +	}
> +
> +	return ret;
> +}

--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux