On 21 Oct 2018, at 11:24, Andrey V. Elsukov wrote:
Author: ae
Date: Sun Oct 21 18:24:20 2018
New Revision: 339554
URL: https://svnweb.freebsd.org/changeset/base/339554
Log:
Rework if_ipsec(4) to use epoch(9) instead of rmlock.
* use CK_LIST and FNV hash to keep chains of softc;
* read access to softc is protected by epoch();
* write access is protected by ipsec_ioctl_sx. Changing of softc
fields
is allowed only when softc is unlinked from CK_LIST chains.
* linking/unlinking of softc is allowed only when ipsec_ioctl_sx is
exclusive locked.
* the plain LIST of all softc is replaced by hash table that uses
ingress
address of tunnels as a key.
* added support for appearing/disappearing of ingress address
handling.
Now it is allowed configure non-local ingress IP address, and thus
the
problem with if_ipsec(4) configuration that happens on boot, when
ingress address is not yet configured, is solved.
MFC after: 1 month
Sponsored by: Yandex LLC
Differential Revision: https://reviews.freebsd.org/D17190
This panics during the pf tests.
To reproduce:
pkg install scapy
kldload pf
cd /usr/tests/sys/netpfil
kyua test
Fatal trap 9: general protection fault while in kernel mode
cpuid = 3; apic id = 03
instruction pointer = 0x20:0xffffffff80ca7260
stack pointer = 0x28:0xfffffe00954c4650
frame pointer = 0x28:0xfffffe00954c4660
code segment = base 0x0, limit 0xfffff, type 0x1b
= DPL 0, pres 1, long 1, def32 0, gran 1
processor eflags = interrupt enabled, resume, IOPL = 0
current process = 3204 (jail)
[ thread pid 3204 tid 101409 ]
Stopped at ipsec_srcaddr+0x40: cmpl $0,ll+0xb(%rbx)
db> bt
Tracing pid 3204 tid 101409 td 0xfffff80084239580
ipsec_srcaddr() at ipsec_srcaddr+0x40/frame 0xfffffe00954c4660
srcaddr_change_event() at srcaddr_change_event+0x14d/frame
0xfffffe00954c46c0
in_difaddr_ioctl() at in_difaddr_ioctl+0x41f/frame 0xfffffe00954c4720
in_ifscrub_all() at in_ifscrub_all+0x13d/frame 0xfffffe00954c47a0
ip_destroy() at ip_destroy+0xbd/frame 0xfffffe00954c47c0
vnet_destroy() at vnet_destroy+0x124/frame 0xfffffe00954c47f0
prison_deref() at prison_deref+0x29d/frame 0xfffffe00954c4830
sys_jail_remove() at sys_jail_remove+0x28a/frame 0xfffffe00954c4880
amd64_syscall() at amd64_syscall+0x278/frame 0xfffffe00954c49b0
fast_syscall_common() at fast_syscall_common+0x101/frame
0xfffffe00954c49b0
--- syscall (508, FreeBSD ELF64, sys_jail_remove), rip = 0x8003131ba,
rsp = 0x7fffffffe828, rbp = 0x7fffffffe8b0 ---
At that point %rbx is 0xdeadc0dedeadc0de, so presumably we’re trying
to dereference something that’s been freed already.
kgdb agrees. The softc has been freed:
#0 __curthread () at ./machine/pcpu.h:230
#1 doadump (textdump=0) at /usr/src/sys/kern/kern_shutdown.c:366
#2 0xffffffff804645db in db_dump (dummy=<optimized out>,
dummy2=<unavailable>, dummy3=<unavailable>, dummy4=<unavailable>) at
/usr/src/sys/ddb/db_command.c:574
#3 0xffffffff804643a9 in db_command (last_cmdp=<optimized out>,
cmd_table=<optimized out>, dopager=<optimized out>) at
/usr/src/sys/ddb/db_command.c:481
#4 0xffffffff80464124 in db_command_loop () at
/usr/src/sys/ddb/db_command.c:534
#5 0xffffffff8046733f in db_trap (type=<optimized out>,
code=<optimized out>) at /usr/src/sys/ddb/db_main.c:252
#6 0xffffffff80be5987 in kdb_trap (type=9, code=0,
tf=0xfffffe00954c4590) at /usr/src/sys/kern/subr_kdb.c:693
#7 0xffffffff81072f51 in trap_fatal (frame=0xfffffe00954c4590, eva=0)
at /usr/src/sys/amd64/amd64/trap.c:921
#8 0xffffffff8107244d in trap (frame=0xfffffe00954c4590) at
/usr/src/sys/amd64/amd64/trap.c:217
#9 <signal handler called>
#10 ipsec_srcaddr (arg=<optimized out>, sa=0xfffff80023591298,
event=<optimized out>) at /usr/src/sys/net/if_ipsec.c:784
#11 0xffffffff80d2de7d in srcaddr_change_event (arg=<optimized out>,
ifp=0xfffff80057864800, ifa=0xfffff80023591200, event=1) at
/usr/src/sys/netinet/ip_encap.c:181
#12 0xffffffff80d1ec4f in in_difaddr_ioctl (cmd=2149607705,
data=<optimized out>, ifp=0xfffff80057864800, td=<optimized out>) at
/usr/src/sys/netinet/in.c:651
#13 0xffffffff80d1f4cd in in_control (cmd=2149607705, ifp=<optimized
out>, td=0xffffffff81b98600 <vnet_entry_ipsec4_srchtbl>, so=<optimized
out>, data=<optimized out>)
at /usr/src/sys/netinet/in.c:250
#14 in_ifscrub_all () at /usr/src/sys/netinet/in.c:935
#15 0xffffffff80d32dfd in ip_destroy (unused=<optimized out>) at
/usr/src/sys/netinet/ip_input.c:398
#16 0xffffffff80ccd734 in vnet_sysuninit () at
/usr/src/sys/net/vnet.c:597
#17 vnet_destroy (vnet=0xfffff80005d9c0c0) at
/usr/src/sys/net/vnet.c:284
#18 0xffffffff80b64c0d in prison_deref (pr=0xffffffff81b0cc30
<prison0>, flags=23) at /usr/src/sys/kern/kern_jail.c:2634
#19 0xffffffff80b6620a in sys_jail_remove (td=<optimized out>,
uap=<optimized out>) at /usr/src/sys/kern/kern_jail.c:2257
#20 0xffffffff81073b28 in syscallenter (td=0xfffff80084239580) at
/usr/src/sys/amd64/amd64/../../kern/subr_syscall.c:135
#21 amd64_syscall (td=0xfffff80084239580, traced=0) at
/usr/src/sys/amd64/amd64/trap.c:1154
#22 <signal handler called>
#23 0x00000008003131ba in ?? ()
Backtrace stopped: Cannot access memory at address 0x7fffffffe828
(kgdb) fr 10
#10 ipsec_srcaddr (arg=<optimized out>, sa=0xfffff80023591298,
event=<optimized out>) at /usr/src/sys/net/if_ipsec.c:784
784 if (sc->family == 0)
(kgdb) p sc
$1 = (struct ipsec_softc *) 0xdeadc0dedeadc0de
(kgdb)
Best regards,
Kristof
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"