From owner-svn-src-user@FreeBSD.ORG Fri Nov 7 17:00:30 2014 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id E14BC4FD; Fri, 7 Nov 2014 17:00:29 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id C16ABF98; Fri, 7 Nov 2014 17:00:29 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id sA7H0TY5037750; Fri, 7 Nov 2014 17:00:29 GMT (envelope-from dchagin@FreeBSD.org) Received: (from dchagin@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id sA7H0S84037746; Fri, 7 Nov 2014 17:00:28 GMT (envelope-from dchagin@FreeBSD.org) Message-Id: <201411071700.sA7H0S84037746@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: dchagin set sender to dchagin@FreeBSD.org using -f From: Dmitry Chagin Date: Fri, 7 Nov 2014 17:00:28 +0000 (UTC) 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 X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 07 Nov 2014 17:00:30 -0000 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); }