Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ofproto:fix use-after-free of ofproto
ASAN report use-after-free of ofproto when destroy ofproto_rule. The rule uses both RCU and refcount, while the ofproto uses only RCU, and the rule retains the pointer of the proto. More importantly, ofproto cannot guarantee a longer grace period than the rule. So when the rule is deleted, it is possible that ofproto has been released, resulting in use-after-free of ofproto. This patch add ref_count for ofproto to avoid use-after-free. =================== ASAN report as following: ==10399==ERROR: AddressSanitizer: heap-use-after-free on address 0xffff61e1e420 at pc 0xaaaadcc29d1c bp 0xffff6c5fde40 sp 0xffff6c5fde60 READ of size 8 at 0xffff61e1e420 thread T12 (urcu2) #0 0xaaaadcc29d1b (/usr/src/debug/openvswitch-2.12.asan.aarch64/ofproto/ofproto.c:2916) openvswitch#1 0xaaaadcf76f5f (/usr/src/debug/openvswitch-2.12.asan.aarch64/lib/ovs-rcu.c:348 (discriminator 3)) openvswitch#2 0xaaaadcf770c7 (/usr/src/debug/openvswitch-2.12.asan.aarch64/lib/ovs-rcu.c:363) openvswitch#3 0xaaaadcf7fa9b (/usr/src/debug/openvswitch-2.12.asan.aarch64/lib/ovs-thread.c:708) #4 0xffff80fde8bb in start_thread (/lib64/libpthread.so.0+0x78bb) #5 0xffff808fa5cb in thread_start (/lib64/libc.so.6+0xd55cb) 0xffff61e1e420 is located 32 bytes inside of 34496-byte region [0xffff61e1e400,0xffff61e26ac0) freed by thread T12 (urcu2) here: #0 0xffff8214fe33 in free (/lib64/libasan.so.4+0xd2e33) openvswitch#1 0xaaaadcc576df (/usr/src/debug/openvswitch-2.12.asan.aarch64/ofproto/ofproto-dpif.c:734) openvswitch#2 0xaaaadcc21acb (/usr/src/debug/openvswitch-2.12.asan.aarch64/ofproto/ofproto.c:1687) openvswitch#3 0xaaaadcf76f5f (/usr/src/debug/openvswitch-2.12.asan.aarch64/lib/ovs-rcu.c:348 (discriminator 3)) #4 0xaaaadcf770c7 (/usr/src/debug/openvswitch-2.12.asan.aarch64/lib/ovs-rcu.c:363) #5 0xaaaadcf7fa9b (/usr/src/debug/openvswitch-2.12.asan.aarch64/lib/ovs-thread.c:708) openvswitch#6 0xffff80fde8bb in start_thread (/lib64/libpthread.so.0+0x78bb) #7 0xffff808fa5cb in thread_start (/lib64/libc.so.6+0xd55cb) previously allocated by thread T0 here: #0 0xffff821503c3 in __interceptor_calloc (/lib64/libasan.so.4+0xd33c3) openvswitch#1 0xaaaadd034717 in xcalloc (/usr/src/debug/openvswitch-2.12.asan.aarch64/lib/util.c:99 (discriminator 3)) openvswitch#2 0xaaaadd034767 in xzalloc (/usr/src/debug/openvswitch-2.12.asan.aarch64/lib/util.c:110) openvswitch#3 0xaaaadcc576ab (/usr/src/debug/openvswitch-2.12.asan.aarch64/ofproto/ofproto-dpif.c:726) #4 0xaaaadcc1be93 in ofproto_create (/usr/src/debug/openvswitch-2.12.asan.aarch64/ofproto/ofproto.c:505) #5 0xaaaadcbd793f (/usr/src/debug/openvswitch-2.12.asan.aarch64/vswitchd/bridge.c:1208) openvswitch#6 0xaaaadcbeefb7 in bridge_run (/usr/src/debug/openvswitch-2.12.asan.aarch64/vswitchd/bridge.c:3944 (discriminator 4)) #7 0xaaaadcbfdb83 in main (/usr/src/debug/openvswitch-2.12.asan.aarch64/vswitchd/ovs-vswitchd.c:240) #8 0xffff80845adf in __libc_start_main (/lib64/libc.so.6+0x20adf) #9 0xaaaadcbd19b3 (/usr/sbin/ovs-vswitchd-2.12.asan+0x26f9b3) SUMMARY: AddressSanitizer: heap-use-after-free (/usr/src/debug/openvswitch-2.12.asan.aarch64/ofproto/ofproto.c:2916) =================== TEST: 1.ASAN test for three days CC: Jarno Rajahalme <jrajahalme@nicira.com> Fixes: 39c9459 ("Use classifier versioning.") Signed-off-by: Hongzhi Guo <guohongzhi1@huawei.com> Signed-off-by: hepeng <xnhp0320@gmail.com> Signed-off-by: 0-day Robot <robot@bytheb.org>
- Loading branch information