Date: Wed, 28 Nov 2018 10:50:59 +0100 From: Peter Holm <peter@holm.cc> To: Konstantin Belousov <kostikbel@gmail.com> Cc: Vladimir Kondratyev <vladimir@kondratyev.su>, current@freebsd.org Subject: Re: r340343 triggers kernel assertion if file is opened with O_BENEATH flag set through symlink Message-ID: <20181128095059.GA13602@x2.osted.lan> In-Reply-To: <20181127234617.GE2378@kib.kiev.ua> References: <d8fd4b5d-b6c7-c56e-79f3-504daceb2a51@kondratyev.su> <20181127234617.GE2378@kib.kiev.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Nov 28, 2018 at 01:46:17AM +0200, Konstantin Belousov wrote: > On Wed, Nov 28, 2018 at 12:54:21AM +0300, Vladimir Kondratyev wrote: > > Following test case triggers assertion after r340343: > > > > > > #include <fcntl.h> > > > > int > > main(int argc, char **argv) > > { > > openat(open("/etc", O_RDONLY), "termcap", O_RDONLY | O_BENEATH); > > } > > > > It results in: > > > > panic: Assertion (ndp->ni_lcf & NI_LCF_LATCH) != 0 failed at > > /usr/src/sys/kern/vfs_lookup.c:182 > > > > The following should fix it. Problem was that the topping directory was > only latched when the initial path was absolute. Since your example > switched from the relative argument to the absolute symlink, the BENEATH > tracker rightfully complained that there were no recorded top. > > I also added some asserts I used during the debugging. > > diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c > index 78893c4f2bd..7a80775d91d 100644 > --- a/sys/kern/vfs_lookup.c With this patch I got a: $ ./beneath.sh open("a/b") succeeded stat("a/b panic: Assertion (ndp->ni_lcf & NI_LCF_LATCH) != 0 failed at ../../../kern/vfs_lookup.c:269 cpuid = 4 time = 1543397647 KDB: stack backtrace: db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe00c71881a0 vpanic() at vpanic+0x1a3/frame 0xfffffe00c7188200 panic() at panic+0x43/frame 0xfffffe00c7188260 namei_handle_root() at namei_handle_root+0xf7/frame 0xfffffe00c71882b0 namei() at namei+0x617/frame 0xfffffe00c71884f0 vn_open_cred() at vn_open_cred+0x526/frame 0xfffffe00c7188640 vn_open() at vn_open+0x4c/frame 0xfffffe00c7188680 kern_openat() at kern_openat+0x2e9/frame 0xfffffe00c71888e0 sys_openat() at sys_openat+0x69/frame 0xfffffe00c7188910 syscallenter() at syscallenter+0x4e3/frame 0xfffffe00c71889f0 amd64_syscall() at amd64_syscall+0x4d/frame 0xfffffe00c7188ab0 fast_syscall_common() at fast_syscall_common+0x101/frame 0xfffffe00c7188ab0 --- syscall (499, FreeBSD ELF64, sys_openat), rip = 0x8003a215a, rsp = 0x7fffffffe4f8, rbp = 0x7fffffffe5e0 --- https://people.freebsd.org/~pho/stress/log/kostik1127.txt - Peter
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20181128095059.GA13602>