svn commit: r283435 - head/sys/compat/linux

Dmitry Chagin dchagin at FreeBSD.org
Sun May 24 16:28:59 UTC 2015


Author: dchagin
Date: Sun May 24 16:28:58 2015
New Revision: 283435
URL: https://svnweb.freebsd.org/changeset/base/283435

Log:
  Convert Linux wait options to the FreeBSD.
  Check wait options as a Linux do.
  Linux always set WEXITED option not a WUNTRACED|WNOHANG
  which is a strange bug.
  
  Differential Revision:	https://reviews.freebsd.org/D1085
  Reviewed by:	trasz

Modified:
  head/sys/compat/linux/linux_misc.c

Modified: head/sys/compat/linux/linux_misc.c
==============================================================================
--- head/sys/compat/linux/linux_misc.c	Sun May 24 16:27:38 2015	(r283434)
+++ head/sys/compat/linux/linux_misc.c	Sun May 24 16:28:58 2015	(r283435)
@@ -886,26 +886,20 @@ linux_common_wait(struct thread *td, int
 int
 linux_waitpid(struct thread *td, struct linux_waitpid_args *args)
 {
-	int options;
- 
+	struct linux_wait4_args wait4_args;
+
 #ifdef DEBUG
 	if (ldebug(waitpid))
 		printf(ARGS(waitpid, "%d, %p, %d"),
 		    args->pid, (void *)args->status, args->options);
 #endif
-	/*
-	 * this is necessary because the test in kern_wait doesn't work
-	 * because we mess with the options here
-	 */
-	if (args->options & ~(WUNTRACED | WNOHANG | WCONTINUED | __WCLONE))
-		return (EINVAL);
-   
-	options = (args->options & (WNOHANG | WUNTRACED));
-	/* WLINUXCLONE should be equal to __WCLONE, but we make sure */
-	if (args->options & __WCLONE)
-		options |= WLINUXCLONE;
 
-	return (linux_common_wait(td, args->pid, args->status, options, NULL));
+	wait4_args.pid = args->pid;
+	wait4_args.status = args->status;
+	wait4_args.options = args->options;
+	wait4_args.rusage = NULL;
+
+	return (linux_wait4(td, &wait4_args));
 }
 #endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */
 
@@ -921,11 +915,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;


More information about the svn-src-head mailing list