linux/net/netfilter/ipset
Stefano Brivio 11921796f4 ipset: Fix memory accounting for hash types on resize
If a fresh array block is allocated during resize, the current in-memory
set size should be increased by the size of the block, not replaced by it.

Before the fix, adding entries to a hash set type, leading to a table
resize, caused an inconsistent memory size to be reported. This becomes
more obvious when swapping sets with similar sizes:

  # cat hash_ip_size.sh
  #!/bin/sh
  FAIL_RETRIES=10

  tries=0
  while [ ${tries} -lt ${FAIL_RETRIES} ]; do
  	ipset create t1 hash:ip
  	for i in `seq 1 4345`; do
  		ipset add t1 1.2.$((i / 255)).$((i % 255))
  	done
  	t1_init="$(ipset list t1|sed -n 's/Size in memory: \(.*\)/\1/p')"

  	ipset create t2 hash:ip
  	for i in `seq 1 4360`; do
  		ipset add t2 1.2.$((i / 255)).$((i % 255))
  	done
  	t2_init="$(ipset list t2|sed -n 's/Size in memory: \(.*\)/\1/p')"

  	ipset swap t1 t2
  	t1_swap="$(ipset list t1|sed -n 's/Size in memory: \(.*\)/\1/p')"
  	t2_swap="$(ipset list t2|sed -n 's/Size in memory: \(.*\)/\1/p')"

  	ipset destroy t1
  	ipset destroy t2
  	tries=$((tries + 1))

  	if [ ${t1_init} -lt 10000 ] || [ ${t2_init} -lt 10000 ]; then
  		echo "FAIL after ${tries} tries:"
  		echo "T1 size ${t1_init}, after swap ${t1_swap}"
  		echo "T2 size ${t2_init}, after swap ${t2_swap}"
  		exit 1
  	fi
  done
  echo "PASS"
  # echo -n 'func hash_ip4_resize +p' > /sys/kernel/debug/dynamic_debug/control
  # ./hash_ip_size.sh
  [ 2035.018673] attempt to resize set t1 from 10 to 11, t 00000000fe6551fa
  [ 2035.078583] set t1 resized from 10 (00000000fe6551fa) to 11 (00000000172a0163)
  [ 2035.080353] Table destroy by resize 00000000fe6551fa
  FAIL after 4 tries:
  T1 size 9064, after swap 71128
  T2 size 71128, after swap 9064

Reported-by: NOYB <JunkYardMail1@Frontier.com>
Fixes: 9e41f26a50 ("netfilter: ipset: Count non-static extension memory for userspace")
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Signed-off-by: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
2019-06-10 12:59:23 +02:00
..
ip_set_bitmap_gen.h ipset: drop ipset_nest_start() and ipset_nest_end() 2019-04-27 17:03:44 -04:00
ip_set_bitmap_ip.c netfilter: ipset: use swap macro instead of _manually_ swapping values 2018-01-08 18:11:11 +01:00
ip_set_bitmap_ipmac.c netfilter: ipset: Make invalid MAC address checks consistent 2018-10-22 23:17:04 +02:00
ip_set_bitmap_port.c netfilter: ipset: use swap macro instead of _manually_ swapping values 2018-01-08 18:11:11 +01:00
ip_set_core.c netfilter: ipset: Fix the last missing check of nla_parse_deprecated() 2019-06-10 12:50:00 +02:00
ip_set_getport.c sctp: remove the typedef sctp_sctphdr_t 2017-07-01 09:08:41 -07:00
ip_set_hash_gen.h ipset: Fix memory accounting for hash types on resize 2019-06-10 12:59:23 +02:00
ip_set_hash_ip.c netfilter: ipset: Fix adding an IPv4 range containing more than 2^31 addresses 2017-09-26 20:15:04 +02:00
ip_set_hash_ipmac.c netfilter: ipset: Make invalid MAC address checks consistent 2018-10-22 23:17:04 +02:00
ip_set_hash_ipmark.c netfilter: ipset: Fix adding an IPv4 range containing more than 2^31 addresses 2017-09-26 20:15:04 +02:00
ip_set_hash_ipport.c netfilter: ipset: Fix adding an IPv4 range containing more than 2^31 addresses 2017-09-26 20:15:04 +02:00
ip_set_hash_ipportip.c netfilter: ipset: Fix adding an IPv4 range containing more than 2^31 addresses 2017-09-26 20:15:04 +02:00
ip_set_hash_ipportnet.c netfilter: ipset: Fix wraparound in hash:*net* types 2018-01-31 14:52:09 +01:00
ip_set_hash_mac.c netfilter: ipset: Allow matching on destination MAC address for mac and ipmac sets 2018-10-22 23:11:21 +02:00
ip_set_hash_net.c netfilter: ipset: Fix wraparound in hash:*net* types 2018-01-31 14:52:09 +01:00
ip_set_hash_netiface.c netfilter: ipset: Fix wraparound in hash:*net* types 2018-01-31 14:52:09 +01:00
ip_set_hash_netnet.c netfilter: ipset: Fix wraparound in hash:*net* types 2018-01-31 14:52:09 +01:00
ip_set_hash_netport.c netfilter: ipset: Fix wraparound in hash:*net* types 2018-01-31 14:52:09 +01:00
ip_set_hash_netportnet.c netfilter: ipset: actually allow allowable CIDR 0 in hash:net,port,net 2018-11-01 00:29:43 +01:00
ip_set_list_set.c ipset: drop ipset_nest_start() and ipset_nest_end() 2019-04-27 17:03:44 -04:00
Kconfig treewide: Add SPDX license identifier - Makefile/Kconfig 2019-05-21 10:50:46 +02:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
pfxlen.c treewide: Add SPDX license identifier for missed files 2019-05-21 10:50:45 +02:00