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