]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
netfilter: fix a use-after-free in mtype_destroy()
authorCong Wang <xiyou.wangcong@gmail.com>
Fri, 10 Jan 2020 19:53:08 +0000 (11:53 -0800)
committerBen Hutchings <ben@decadent.org.uk>
Tue, 28 Apr 2020 18:03:24 +0000 (19:03 +0100)
commit c120959387efa51479056fd01dc90adfba7a590c upstream.

map->members is freed by ip_set_free() right before using it in
mtype_ext_cleanup() again. So we just have to move it down.

Reported-by: syzbot+4c3cc6dbe7259dbf9054@syzkaller.appspotmail.com
Fixes: 40cd63bf33b2 ("netfilter: ipset: Support extensions which need a per data destroy function")
Acked-by: Jozsef Kadlecsik <kadlec@netfilter.org>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
[bwh: Backported to 3.16: adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
net/netfilter/ipset/ip_set_bitmap_gen.h

index f2c7d83dc23f46b83e4d24e665f2abc31317783b..6338b96d8f17e417efef2a46f3c01ea3dc879076 100644 (file)
@@ -66,12 +66,12 @@ mtype_destroy(struct ip_set *set)
        if (SET_WITH_TIMEOUT(set))
                del_timer_sync(&map->gc);
 
-       ip_set_free(map->members);
        if (set->dsize) {
                if (set->extensions & IPSET_EXT_DESTROY)
                        mtype_ext_cleanup(set);
                ip_set_free(map->extensions);
        }
+       ip_set_free(map->members);
        kfree(map);
 
        set->data = NULL;