On 12/12/2019 00:00, Konstantin Belousov wrote: > On Wed, Dec 11, 2019 at 03:52:30PM +0000, Andriy Gapon wrote: >> Author: avg >> Date: Wed Dec 11 15:52:29 2019 >> New Revision: 355611 >> URL: https://svnweb.freebsd.org/changeset/base/355611 >> >> Log: >> add a sanity check to the system call registration code >> >> A system call number should be at least reserved. >> We do not expect an attempt to register a fixed number system call >> when nothing at all is known about it. >> >> MFC after: 3 weeks >> Sponsored by: Panzura >> >> Modified: >> head/sys/kern/kern_syscalls.c >> >> Modified: head/sys/kern/kern_syscalls.c >> ============================================================================== >> --- head/sys/kern/kern_syscalls.c Wed Dec 11 15:15:21 2019 >> (r355610) >> +++ head/sys/kern/kern_syscalls.c Wed Dec 11 15:52:29 2019 >> (r355611) >> @@ -120,11 +120,14 @@ kern_syscall_register(struct sysent *sysents, int *off >> if (i == SYS_MAXSYSCALL) >> return (ENFILE); >> *offset = i; >> - } else if (*offset < 0 || *offset >= SYS_MAXSYSCALL) >> + } else if (*offset < 0 || *offset >= SYS_MAXSYSCALL) { >> return (EINVAL); >> - else if (sysents[*offset].sy_call != (sy_call_t *)lkmnosys && >> - sysents[*offset].sy_call != (sy_call_t *)lkmressys) >> + } else if (sysents[*offset].sy_call != (sy_call_t *)lkmnosys && >> + sysents[*offset].sy_call != (sy_call_t *)lkmressys) { >> + KASSERT(sysents[*offset].sy_call != NULL, >> + ("undefined syscall %d", *offset)); > I do not think that the assert is very useful. On debug kernels, where > the development would most likely take place, its only function is to annoy > developer by requiring him to reboot the host if he did not guessed a > free syscall number right. > > I suggest to convert this into printf, might be also under bootverbose. > > Also, why do you say that the syscall is undefined ? I would state that > it is not reusable for dynamically loaded syscall, instead.
I admit that panic() could be an overreaction to a problem that I somehow created for myself. And the check is not very robust too (but without false positives) . But we should never see sy_call == NULL in sysents, NULL is not a valid value for the field. I think that somehow my init_sysent.c was out-of-sync with the rest of files generated from syscalls.master. So, I got a situation where I tried to dynamically register a system that was below SYS_MAXSYSCALL but beyond the end of sysent[], and apparently that region happened to be zero-filled. So, confusingly, kern_syscall_register() returned EEXIST. >> return (EEXIST); >> + } >> >> KASSERT(sysents[*offset].sy_thrcnt == SY_THR_ABSENT, >> ("dynamic syscall is not protected")); -- Andriy Gapon _______________________________________________ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"