Skip site navigation (1)Skip section navigation (2)
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>