kern/94232: missing rt_sigpending call in Linux emulation code
Stanislav Sedov
ssedov at mbsd.msk.ru
Wed Mar 8 08:00:30 PST 2006
>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 at 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:
More information about the freebsd-bugs
mailing list