diff options
author | Vishwanath Pai <vpai@akamai.com> | 2017-02-16 14:55:45 -0500 |
---|---|---|
committer | Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> | 2017-02-19 13:08:47 -0500 |
commit | 40b446a1d8af17274746ff7079aa0a618dffbac3 (patch) | |
tree | c54107c91855cfec21bd9e7ea9af3a6730ed527e | |
parent | 50054a9223aaf79985c55ef7dd090ced15581567 (diff) |
netfilter: ipset: Null pointer exception in ipset list:set
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>
-rw-r--r-- | net/netfilter/ipset/ip_set_list_set.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/net/netfilter/ipset/ip_set_list_set.c b/net/netfilter/ipset/ip_set_list_set.c index 51077c53d76b..178d4eba013b 100644 --- a/net/netfilter/ipset/ip_set_list_set.c +++ b/net/netfilter/ipset/ip_set_list_set.c | |||
@@ -260,11 +260,14 @@ list_set_uadd(struct ip_set *set, void *value, const struct ip_set_ext *ext, | |||
260 | else | 260 | else |
261 | prev = e; | 261 | prev = e; |
262 | } | 262 | } |
263 | |||
264 | /* If before/after is used on an empty set */ | ||
265 | if ((d->before > 0 && !next) || | ||
266 | (d->before < 0 && !prev)) | ||
267 | return -IPSET_ERR_REF_EXIST; | ||
268 | |||
263 | /* Re-add already existing element */ | 269 | /* Re-add already existing element */ |
264 | if (n) { | 270 | if (n) { |
265 | if ((d->before > 0 && !next) || | ||
266 | (d->before < 0 && !prev)) | ||
267 | return -IPSET_ERR_REF_EXIST; | ||
268 | if (!flag_exist) | 271 | if (!flag_exist) |
269 | return -IPSET_ERR_EXIST; | 272 | return -IPSET_ERR_EXIST; |
270 | /* Update extensions */ | 273 | /* Update extensions */ |