Date: Wed, 8 Mar 2006 18:58:37 +0300 From: Stanislav Sedov <ssedov@mbsd.msk.ru> To: FreeBSD-gnats-submit@FreeBSD.org Subject: kern/94232: missing rt_sigpending call in Linux emulation code Message-ID: <20060308155837.GA1762@fonon.realnet> Resent-Message-ID: <200603081600.k28G0TA7036978@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 94232 >Category: kern >Synopsis: missing rt_sigpending call in Linux emulation code >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Mar 08 16:00:29 GMT 2006 >Closed-Date: >Last-Modified: >Originator: Stanislav Sedov >Release: FreeBSD 7.0-CURRENT i386 >Organization: MBSD labs >Environment: System: FreeBSD fonon.realnet 7.0-CURRENT FreeBSD 7.0-CURRENT #0: Tue Feb 21 18:07:56 MSK 2006 stas@fonon.realnet:/work/src/fbsd-cur/src/sys/i386/compile/FONON i386 >Description: rt_sigpending call is missing. Recent Linux applications require this (e.g. Maple 10, Cadence). >How-To-Repeat: Try to run Maple 10, for example. >Fix: --- linux_signal.c.diff begins here --- --- linux_signal.c.orig Wed Mar 8 00:44:49 2006 +++ linux_signal.c Wed Mar 8 00:49:28 2006 @@ -406,6 +406,30 @@ mask = lset.__bits[0]; return (copyout(&mask, args->mask, sizeof(mask))); } + +/* + * MPSAFE + */ +int +linux_sigpending(struct thread *td, struct linux_rt_sigpending_args *args) +{ + struct proc *p = td->td_proc; + sigset_t bset; + l_sigset_t lset; + +#ifdef DEBUG + if (ldebug(rt_sigpending)) + printf(ARGS(rt_sigpending, "*")); +#endif + + PROC_LOCK(p); + bset = p->p_siglist; + SIGSETOR(bset, td->td_siglist); + SIGSETAND(bset, td->td_sigmask); + PROC_UNLOCK(p); + bsd_to_linux_sigset(&bset, &lset); + return (copyout(&lset, args->mask, args->sigsetsize)); +} #endif /*!__alpha__*/ int --- linux_signal.c.diff ends here --- --- syscalls.master.diff begins here --- --- syscalls.master.orig Wed Mar 8 00:43:01 2006 +++ syscalls.master Wed Mar 8 00:52:07 2006 @@ -316,7 +316,8 @@ 175 AUE_NULL MSTD { int linux_rt_sigprocmask(l_int how, \ l_sigset_t *mask, l_sigset_t *omask, \ l_size_t sigsetsize); } -176 AUE_NULL MSTD { int linux_rt_sigpending(void); } +176 AUE_NULL MSTD { int linux_rt_sigpending(l_sigset_t *mask, \ + l_size_t sigsetsize); } 177 AUE_NULL MSTD { int linux_rt_sigtimedwait(void); } 178 AUE_NULL MSTD { int linux_rt_sigqueueinfo(void); } 179 AUE_NULL MSTD { int linux_rt_sigsuspend( \ --- syscalls.master.diff ends here --- --- linux_dummy.c.diff begins here --- --- linux_dummy.c.orig Wed Mar 8 00:54:36 2006 +++ linux_dummy.c Wed Mar 8 00:53:34 2006 @@ -60,7 +60,6 @@ DUMMY(prctl); DUMMY(rt_sigtimedwait); DUMMY(rt_sigqueueinfo); -DUMMY(rt_sigpending); DUMMY(capget); DUMMY(capset); DUMMY(sendfile); --- linux_dummy.c.diff ends here --- >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060308155837.GA1762>