netfilter: ipset: Null pointer exception in ipset list:set
authorVishwanath Pai <vpai@akamai.com>
Thu, 16 Feb 2017 19:55:45 +0000 (20:55 +0100)
committerJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Sun, 19 Feb 2017 18:08:47 +0000 (19:08 +0100)
If we use before/after to add an element to an empty list it will cause
a kernel panic.

$> cat crash.restore
create a hash:ip
create b hash:ip
create test list:set timeout 5 size 4
add test b before a

$> ipset -R < crash.restore

Executing the above will crash the kernel.

Signed-off-by: Vishwanath Pai <vpai@akamai.com>
Reviewed-by: Josh Hunt <johunt@akamai.com>
Signed-off-by: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
net/netfilter/ipset/ip_set_list_set.c

index 51077c5..178d4eb 100644 (file)
@@ -260,11 +260,14 @@ list_set_uadd(struct ip_set *set, void *value, const struct ip_set_ext *ext,
                else
                        prev = e;
        }
+
+       /* If before/after is used on an empty set */
+       if ((d->before > 0 && !next) ||
+           (d->before < 0 && !prev))
+               return -IPSET_ERR_REF_EXIST;
+
        /* Re-add already existing element */
        if (n) {
-               if ((d->before > 0 && !next) ||
-                   (d->before < 0 && !prev))
-                       return -IPSET_ERR_REF_EXIST;
                if (!flag_exist)
                        return -IPSET_ERR_EXIST;
                /* Update extensions */