if_detach() does if_remove(ifp); NET_LOCK(); rti_delete(). New
authorbluhm <bluhm@openbsd.org>
Mon, 28 Mar 2022 16:31:26 +0000 (16:31 +0000)
committerbluhm <bluhm@openbsd.org>
Mon, 28 Mar 2022 16:31:26 +0000 (16:31 +0000)
commita134c703e536b786e27dd7a07825eea121502871
tree64b2a992e50824a90226a92fde1abf305463093a
parent6b0fbbfd38cde06649fbb87435b1ffea39c2dac3
if_detach() does if_remove(ifp); NET_LOCK(); rti_delete().  New
igmp groups may join while sleeping in interface destruction.  In
this case if_get() in igmp_joingroup() fails and rti_fill() is not
called.  Then inm->inm_rti may be NULL.  This is the condition when
syzkaller crashes in igmp_leavegroup().
Pass the ifp the current CPU is already holding down to igmp_joingroup()
and igmp_leavegroup() to avoid half constructed igmp groups.  Calling
if_get() in caller and callee makes no sense anyway.
Reported-by: syzbot+146823a676b7bea83649@syzkaller.appspotmail.com
OK denis@
sys/netinet/igmp.c
sys/netinet/igmp_var.h
sys/netinet/in.c