Make a linux_rt_sigtimedwait() system call is actually working.

1) Translate the native signal number in the appropriate Linux signal.
2) Remove bogus code, which can lead to a panic as it calls
   kern_sigtimedwait with same ksiginfo.
3) Return the corresponding signal number.
This commit is contained in:
Dmitry Chagin 2011-02-15 21:42:48 +00:00
parent 8c50c56206
commit f3481dd9ab
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=218719

View File

@ -431,7 +431,7 @@ int
linux_rt_sigtimedwait(struct thread *td,
struct linux_rt_sigtimedwait_args *args)
{
int error;
int error, sig;
l_timeval ltv;
struct timeval tv;
struct timespec ts, *tsa;
@ -495,19 +495,15 @@ linux_rt_sigtimedwait(struct thread *td,
if (error)
return (error);
sig = BSD_TO_LINUX_SIGNAL(info.ksi_signo);
if (args->ptr) {
memset(&linfo, 0, sizeof(linfo));
linfo.lsi_signo = info.ksi_signo;
ksiginfo_to_lsiginfo(&info, &linfo, sig);
error = copyout(&linfo, args->ptr, sizeof(linfo));
}
/* Repost if we got an error. */
if (error && info.ksi_signo) {
PROC_LOCK(td->td_proc);
tdksignal(td, info.ksi_signo, &info);
PROC_UNLOCK(td->td_proc);
} else
td->td_retval[0] = info.ksi_signo;
if (error == 0)
td->td_retval[0] = sig;
return (error);
}