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