FAILED: patch "[PATCH] netfilter: ipset: use bitmap infrastructure completely" failed to apply to 4.14-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.14-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 32c72165dbd0e246e69d16a3ad348a4851afd415 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kadlecsik=20J=C3=B3zsef?= <[email protected]>
Date: Sun, 19 Jan 2020 22:06:49 +0100
Subject: [PATCH] netfilter: ipset: use bitmap infrastructure completely
The bitmap allocation did not use full unsigned long sizes when calculating the required size and that was triggered by KASAN as slab-out-of-bounds read in several places. The patch fixes all of them.
Reported-by [email protected]
Reported-by [email protected]
Reported-by [email protected]
Reported-by [email protected]
Reported-by [email protected]
Reported-by [email protected]
Reported-by [email protected]
Signed-off-by Jozsef Kadlecsik <[email protected]>
Signed-off-by Pablo Neira Ayuso <[email protected]>
include/linux/netfilter/ipset/ip_set.h +0 -7
@@ -426,13 +426,6 @@ ip6addrptr(const struct sk_buff *skb, bool src, struct in6_addr *addr) sizeof(*addr)); } -/* Calculate the bytes required to store the inclusive range of a-b */ -static inline int -bitmap_bytes (u32 a,u32 b) -{ -return 4 * ((((b - a +8 ) /8 ) +3 ) /4 ); -} -/* How often should the gc be run by default */ #define IPSET_GC_TIME (3 * 60)
net/netfilter/ipset/ip_set_bitmap_gen.h +1 -1
@@ -75,7 +75,7 @@ mtype_flush(struct ip_set *set)if (set->extensions &IPSET_EXT_DESTROY )mtype_ext_cleanup (set); -memset (map->members,0 , map->memsize); +bitmap_zero (map->members, map->elements); set->elements =0 ; set->ext_size =0 ; }
net/netfilter/ipset/ip_set_bitmap_ip.c +3 -3
@@ -37,7 +37,7 @@ MODULE_ALIAS("ip_set_bitmap:ip");/* Type structure */ struct bitmap_ip { -void *members;/* the set members */ +unsigned long *members;/* the set members */ u32 first_ip;/* host byte order, included in range */ u32 last_ip;/* host byte order, included in range */ u32 elements;/* number of max elements in the set */
@@ -220,7 +220,7 @@ init_map_ip(struct ip_set *set, struct bitmap_ip *map, u32 first_ip, u32 last_ip, u32 elements, u32 hosts, u8 netmask) { - map->members = ip_set_alloc(map->memsize); + map->members = bitmap_zalloc(elements, GFP_KERNEL | __GFP_NOWARN);if (!map->members)return false; map->first_ip = first_ip;
@@ -322,7 +322,7 @@ bitmap_ip_create(struct net *net, struct ip_set *set, struct nlattr *tb[],if (!map)return -ENOMEM ; - map->memsize =bitmap_bytes (0 , elements -1 ); + map->memsize =BITS_TO_LONGS (elements) *sizeof (unsigned long ); set->variant = &bitmap_ip;if (!init_map_ip (set, map, first_ip, last_ip, elements, hosts, netmask)) {
net/netfilter/ipset/ip_set_bitmap_ipmac.c +3 -3
@@ -42,7 +42,7 @@ enum {/* Type structure */ struct bitmap_ipmac { -void *members;/* the set members */ +unsigned long *members;/* the set members */ u32 first_ip;/* host byte order, included in range */ u32 last_ip;/* host byte order, included in range */ u32 elements;/* number of max elements in the set */
@@ -299,7 +299,7 @@ static bool init_map_ipmac(struct ip_set *set, struct bitmap_ipmac *map, u32 first_ip, u32 last_ip, u32 elements) { - map->members = ip_set_alloc(map->memsize); + map->members = bitmap_zalloc(elements, GFP_KERNEL | __GFP_NOWARN);if (!map->members)return false; map->first_ip = first_ip;
@@ -360,7 +360,7 @@ bitmap_ipmac_create(struct net *net, struct ip_set *set, struct nlattr *tb[],if (!map)return -ENOMEM ; - map->memsize =bitmap_bytes (0 , elements -1 ); + map->memsize =BITS_TO_LONGS (elements) *sizeof (unsigned long ); set->variant = &bitmap_ipmac;if (!init_map_ipmac (set, map, first_ip, last_ip, elements)) {kfree (map);
net/netfilter/ipset/ip_set_bitmap_port.c +3 -3
@@ -30,7 +30,7 @@ MODULE_ALIAS("ip_set_bitmap:port");/* Type structure */ struct bitmap_port { -void *members;/* the set members */ +unsigned long *members;/* the set members */ u16 first_port;/* host byte order, included in range */ u16 last_port;/* host byte order, included in range */ u32 elements;/* number of max elements in the set */
@@ -231,7 +231,7 @@ static bool init_map_port(struct ip_set *set, struct bitmap_port *map, u16 first_port, u16 last_port) { - map->members = ip_set_alloc(map->memsize); + map->members = bitmap_zalloc(map->elements, GFP_KERNEL | __GFP_NOWARN);if (!map->members)return false; map->first_port = first_port;
@@ -271,7 +271,7 @@ bitmap_port_create(struct net *net, struct ip_set *set, struct nlattr *tb[],return -ENOMEM ; map->elements = elements; - map->memsize =bitmap_bytes (0 , map->elements); + map->memsize =BITS_TO_LONGS (elements) *sizeof (unsigned long ); set->variant = &bitmap_port;if (!init_map_port (set, map, first_port, last_port)) {kfree (map);