Use struct refcnt for interface address reference counting.
authorbluhm <bluhm@openbsd.org>
Mon, 29 Aug 2022 07:51:45 +0000 (07:51 +0000)
committerbluhm <bluhm@openbsd.org>
Mon, 29 Aug 2022 07:51:45 +0000 (07:51 +0000)
commit18a44669273a480c6bde7a39e70e368af32c272f
treedcff11b3ee40f4bd7341e0b5370a5ad09ffaad39
parenta9131ecf99673df8ba7402f7f5c11bde7fc8f8b4
Use struct refcnt for interface address reference counting.
There was a crash due to use after free of the ifa although it is
ref counted.  As ifa_refcnt was a simple integer increment, there
may be a path where multiple CPUs access it concurrently.  So change
to struct refcnt which is MP safe and provides dt(4) leak debugging.
Link level address for IPsec enc(4) and various MPLS interfaces is
special.  There ifa is part of struct sc.  Use refcount anyway and
add a panic to detect use after free.
bug report stsp@; OK mvs@
13 files changed:
sys/dev/dt/dt_prov_static.c
sys/net/if_enc.c
sys/net/if_mpe.c
sys/net/if_mpip.c
sys/net/if_mpw.c
sys/net/if_pppx.c
sys/net/if_var.h
sys/net/route.c
sys/net/rtsock.c
sys/netinet/in.c
sys/netinet6/in6.c
sys/netinet6/nd6_nbr.c
sys/sys/refcnt.h