Date: Fri, 7 Nov 2014 17:00:28 +0000 (UTC) From: Dmitry Chagin <dchagin@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r274245 - in user/dchagin/lemul/sys: amd64/linux amd64/linux32 i386/linux Message-ID: <201411071700.sA7H0S84037746@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: dchagin Date: Fri Nov 7 17:00:28 2014 New Revision: 274245 URL: https://svnweb.freebsd.org/changeset/base/274245 Log: 1. Linux always set WEXITED option, not a WUNTRACED|WNOHANG! This is a strange bug. 2. Fix siginfo in WNOHANG case waitid() system call. Modified: user/dchagin/lemul/sys/amd64/linux/linux_machdep.c user/dchagin/lemul/sys/amd64/linux32/linux32_machdep.c user/dchagin/lemul/sys/i386/linux/linux_machdep.c Modified: user/dchagin/lemul/sys/amd64/linux/linux_machdep.c ============================================================================== --- user/dchagin/lemul/sys/amd64/linux/linux_machdep.c Fri Nov 7 16:35:31 2014 (r274244) +++ user/dchagin/lemul/sys/amd64/linux/linux_machdep.c Fri Nov 7 17:00:28 2014 (r274245) @@ -503,11 +503,12 @@ linux_wait4(struct thread *td, struct li args->pid, (void *)args->status, args->options, (void *)args->rusage); #endif + if (args->options & ~(LINUX_WUNTRACED | LINUX_WNOHANG | + LINUX_WCONTINUED | __WCLONE | __WNOTHREAD | __WALL)) + return (EINVAL); - options = (args->options & (WNOHANG | WUNTRACED)); - /* WLINUXCLONE should be equal to __WCLONE, but we make sure */ - if (args->options & __WCLONE) - options |= WLINUXCLONE; + options = WEXITED; + linux_to_bsd_waitopts(args->options, &options); if (args->rusage != NULL) rup = &ru; @@ -530,6 +531,7 @@ linux_waitid(struct thread *td, struct l siginfo_t siginfo; l_siginfo_t lsi; idtype_t idtype; + struct proc *p; int error; options = 0; @@ -562,22 +564,23 @@ linux_waitid(struct thread *td, struct l &wru, &siginfo); if (error) return (error); - td->td_retval[0] = 0; - if (args->rusage != NULL) { error = copyout(&wru.wru_children, args->rusage, sizeof(wru.wru_children)); if (error) return (error); } - if (args->info != NULL) { - sig = siginfo.si_signo; - if (siginfo.si_signo <= td->td_proc->p_sysent->sv_sigsize) - sig = td->td_proc->p_sysent->sv_sigtbl[_SIG_IDX(sig)]; - siginfo_to_lsiginfo(&siginfo, &lsi, sig); + p = td->td_proc; + if (td->td_retval[0] == 0) + bzero(&lsi, sizeof(lsi)); + else { + sig = BSD_TO_LINUX_SIGNAL(siginfo.si_signo); + siginfo_to_lsiginfo(&siginfo, &lsi, sig); + } error = copyout(&lsi, args->info, sizeof(lsi)); } + td->td_retval[0] = 0; return (error); } Modified: user/dchagin/lemul/sys/amd64/linux32/linux32_machdep.c ============================================================================== --- user/dchagin/lemul/sys/amd64/linux32/linux32_machdep.c Fri Nov 7 16:35:31 2014 (r274244) +++ user/dchagin/lemul/sys/amd64/linux32/linux32_machdep.c Fri Nov 7 17:00:28 2014 (r274245) @@ -1039,8 +1039,11 @@ linux_wait4(struct thread *td, struct li args->pid, (void *)args->status, args->options, (void *)args->rusage); #endif + if (args->options & ~(LINUX_WUNTRACED | LINUX_WNOHANG | + LINUX_WCONTINUED | __WCLONE | __WNOTHREAD | __WALL)) + return (EINVAL); - options = 0; + options = WEXITED; linux_to_bsd_waitopts(args->options, &options); if (args->rusage != NULL) @@ -1067,6 +1070,7 @@ linux_waitid(struct thread *td, struct l siginfo_t siginfo; l_siginfo_t lsi; idtype_t idtype; + struct proc *p; int error; options = 0; @@ -1099,20 +1103,23 @@ linux_waitid(struct thread *td, struct l &wru, &siginfo); if (error) return (error); - td->td_retval[0] = 0; - if (args->rusage != NULL) { bsd_to_linux_rusage(&wru.wru_children, &lru); error = copyout(&lru, args->rusage, sizeof(lru)); if (error) return (error); } - if (args->info != NULL) { - sig = BSD_TO_LINUX_SIGNAL(siginfo.si_signo); - siginfo_to_lsiginfo(&siginfo, &lsi, sig); + p = td->td_proc; + if (td->td_retval[0] == 0) + bzero(&lsi, sizeof(lsi)); + else { + sig = BSD_TO_LINUX_SIGNAL(siginfo.si_signo); + siginfo_to_lsiginfo(&siginfo, &lsi, sig); + } error = copyout(&lsi, args->info, sizeof(lsi)); } + td->td_retval[0] = 0; return (error); } Modified: user/dchagin/lemul/sys/i386/linux/linux_machdep.c ============================================================================== --- user/dchagin/lemul/sys/i386/linux/linux_machdep.c Fri Nov 7 16:35:31 2014 (r274244) +++ user/dchagin/lemul/sys/i386/linux/linux_machdep.c Fri Nov 7 17:00:28 2014 (r274245) @@ -1058,11 +1058,12 @@ linux_wait4(struct thread *td, struct li args->pid, (void *)args->status, args->options, (void *)args->rusage); #endif + if (args->options & ~(LINUX_WUNTRACED | LINUX_WNOHANG | + LINUX_WCONTINUED | __WCLONE | __WNOTHREAD | __WALL)) + return (EINVAL); - options = (args->options & (WNOHANG | WUNTRACED)); - /* WLINUXCLONE should be equal to __WCLONE, but we make sure */ - if (args->options & __WCLONE) - options |= WLINUXCLONE; + options = WEXITED; + linux_to_bsd_waitopts(args->options, &options); if (args->rusage != NULL) rup = &ru; @@ -1085,6 +1086,7 @@ linux_waitid(struct thread *td, struct l siginfo_t siginfo; l_siginfo_t lsi; idtype_t idtype; + struct proc *p; int error; options = 0; @@ -1117,22 +1119,24 @@ linux_waitid(struct thread *td, struct l &wru, &siginfo); if (error) return (error); - td->td_retval[0] = 0; - if (args->rusage != NULL) { error = copyout(&wru.wru_children, args->rusage, sizeof(wru.wru_children)); if (error) return (error); } - if (args->info != NULL) { - sig = siginfo.si_signo; - if (siginfo.si_signo <= td->td_proc->p_sysent->sv_sigsize) - sig = td->td_proc->p_sysent->sv_sigtbl[_SIG_IDX(sig)]; + p = td->td_proc; + if (td->td_retval[0] == 0) + bzero(&lsi, sizeof(lsi)); + else { + sig = BSD_TO_LINUX_SIGNAL(siginfo.si_signo); + siginfo_to_lsiginfo(&siginfo, &lsi, sig); + } siginfo_to_lsiginfo(&siginfo, &lsi, sig); error = copyout(&lsi, args->info, sizeof(lsi)); } + td->td_retval[0] = 0; return (error); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201411071700.sA7H0S84037746>