]> granicus.if.org Git - ipset/commitdiff
Constified attribute cannot be written
authorJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Wed, 26 Jan 2011 21:59:25 +0000 (22:59 +0100)
committerJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Wed, 26 Jan 2011 21:59:25 +0000 (22:59 +0100)
Attribute is const so a little bit more work is needed to return
the error line number. A test is also added in order to check
the functionality. (Patrick McHardy's review)

kernel/ip_set_core.c
tests/ipmap.t

index 3071d3fc59eba56661b7cb9fd58eec3723718966..3dad957e96eb81aa25984f0e95b35ca12b9a6192 100644 (file)
@@ -1118,7 +1118,17 @@ call_ad(struct sk_buff *skb, const struct nlattr *const attr[],
                return 0;
        if (lineno && attr[IPSET_ATTR_LINENO]) {
                /* Error in restore/batch mode: send back lineno */
-               u32 *errline = nla_data(attr[IPSET_ATTR_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;
        }
index f6dd3676edb2d3c42c05887893ae37d3dd84fe66..af6e36bb3ce65955cd50f851003f4667105926be 100644 (file)
@@ -42,6 +42,8 @@
 0 ipset -X test
 # Range: Restore set and catch error
 1 sed 's/2.0.0.131/222.0.0.131/' < ipmap.t.restore | ipset -R
+# Range: Check returned error line number
+0 num=`sed 's/.* in line //' < .foo.err | cut -d : -f 1` && test $num -eq 6 
 # Range: Destroy set
 0 ipset -X test
 # Range: Restore set