On Thu, Jul 27, 2017 at 10:06:53PM +0700, Eugene Grosbein
wrote:> Hi!
>
> Very recently stable/11 got a problem somewhere between r321073 and
r321459:
> /bin/sh crashes with SIGSYS at boot time:
>
> Trying to mount root from ufs:/dev/ada0s1a [ro]...
> start_init: trying /sbin/init
> ppid 21 (sh), uid 0: exited on signal 12
> id 21 comm sh: nosys 42
> Jul 27 14:30:23 init: /bin/sh on /etc/rc terminated abnormally, going to
single user mode
Take your /bin/sh, libraries and rtld to some other machine and try to
catch where the pipe(2) call come from. I do not see any other way
forward, assuming your build env is not contaminated somehow.
I did the following on the today stable/11:
pooma% ktrace -if /tmp/ktrace.out sh -c 'jot 100 | grep 1 | wc -l'
20
pooma% kdump -f /tmp/ktrace.out | grep pipe
1493 sh CALL pipe2(0x7fffffffe390,0)
1493 sh RET pipe2 0
1493 sh CALL pipe2(0x7fffffffe390,0)
1493 sh RET pipe2 0
>
> This is *not* upgrade but complete rebuild of NanoBSD image:
> all binaries, libraries and kernel are built from stable/11 sources.
>
> My custom kernel for amd64 has COMPAT_43TTY and COMPAT_FREEBSD32 options
> and no other COMPAT_XXX options. It has no COMPAT_FREEBSD10 option too
> as this is new installation.
>
> Also, I needed the following patch to make sysctl kern.lognosys
> work for non-tty case:
>
> --- sys/kern/subr_prf.c.orig 2017-07-25 15:14:27.236304000 +0700
> +++ sys/kern/subr_prf.c 2017-07-27 21:05:55.912042000 +0700
> @@ -958,6 +958,7 @@ number:
> break;
> }
> }
> + return (retval);
> #undef PCHAR
> }
>
> --- sys/kern/kern_sig.c.orig 2017-07-25 15:14:27.232126000 +0700
> +++ sys/kern/kern_sig.c 2017-07-27 21:07:58.298440000 +0700
> @@ -3596,7 +3596,9 @@
> tdsignal(td, SIGSYS);
> PROC_UNLOCK(p);
> if (kern_lognosys)
> - uprintf("pid %d comm %s: nosys %d\n",
p->p_pid, p->p_comm,
> + if (!uprintf("pid %d comm %s: nosys %d\n",
p->p_pid, p->p_comm,
> + td->td_sa.code))
> + printf("pid %d comm %s: nosys %d\n",
p->p_pid, p->p_comm,
> td->td_sa.code);
> return (ENOSYS);
> }
>
The following has more regular behavior.
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index 37da97924ca..ce5e7b2768f 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -3579,9 +3579,14 @@ nosys(struct thread *td, struct nosys_args *args)
PROC_LOCK(p);
tdsignal(td, SIGSYS);
PROC_UNLOCK(p);
- if (kern_lognosys)
+ if (kern_lognosys == 1 || kern_lognosys == 3) {
uprintf("pid %d comm %s: nosys %d\n", p->p_pid, p->p_comm,
td->td_sa.code);
+ }
+ if (kern_lognosys == 2 || kern_lognosys == 3) {
+ printf("pid %d comm %s: nosys %d\n", p->p_pid, p->p_comm,
+ td->td_sa.code);
+ }
return (ENOSYS);
}