Module Name:    src
Committed By:   martin
Date:           Wed Apr 18 10:37:37 UTC 2012

Modified Files:
        src/lib/librumphijack: hijack.c

Log Message:
poll(), pollts() and select() all return int values, but in the hijack
emulation of them these get passed as exit values from a pthread as
a void* (c.f. pthread_join(), pthread_exit()).
Do not use the address of an int variable for these, but provide the address
of a void* and assign the value afterwards.
Fixes hijacking of pollts/select on 64bit big endian hosts.
Spotted by and fix from pooka.


To generate a diff of this commit:
cvs rdiff -u -r1.91 -r1.92 src/lib/librumphijack/hijack.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/librumphijack/hijack.c
diff -u src/lib/librumphijack/hijack.c:1.91 src/lib/librumphijack/hijack.c:1.92
--- src/lib/librumphijack/hijack.c:1.91	Wed Feb  1 05:34:41 2012
+++ src/lib/librumphijack/hijack.c	Wed Apr 18 10:37:37 2012
@@ -1,4 +1,4 @@
-/*      $NetBSD: hijack.c,v 1.91 2012/02/01 05:34:41 dholland Exp $	*/
+/*      $NetBSD: hijack.c,v 1.92 2012/04/18 10:37:37 martin Exp $	*/
 
 /*-
  * Copyright (c) 2011 Antti Kantee.  All Rights Reserved.
@@ -29,7 +29,7 @@
 #undef _FORTIFY_SOURCE
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: hijack.c,v 1.91 2012/02/01 05:34:41 dholland Exp $");
+__RCSID("$NetBSD: hijack.c,v 1.92 2012/04/18 10:37:37 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -1654,7 +1654,7 @@ hostpoll(void *arg)
 		parg->errnum = errno;
 	rump_sys_write(parg->pipefd, &rv, sizeof(rv));
 
-	return (void *)(intptr_t)rv;
+	return (void *)rv;
 }
 
 int
@@ -1676,8 +1676,8 @@ REALPOLLTS(struct pollfd *fds, nfds_t nf
 		struct pollfd *pfd_host = NULL, *pfd_rump = NULL;
 		int rpipe[2] = {-1,-1}, hpipe[2] = {-1,-1};
 		struct pollarg parg;
-		uintptr_t lrv;
-		int sverrno = 0, trv;
+		void *trv_val;
+		int sverrno = 0, lrv, trv;
 
 		/*
 		 * ok, this is where it gets tricky.  We must support
@@ -1770,7 +1770,8 @@ REALPOLLTS(struct pollfd *fds, nfds_t nf
 		lrv = op_pollts(pfd_rump, nfds+1, ts, NULL);
 		sverrno = errno;
 		write(hpipe[1], &rv, sizeof(rv));
-		pthread_join(pt, (void *)&trv);
+		pthread_join(pt, &trv_val);
+		trv = (int)(intptr_t)trv_val;
 
 		/* check who "won" and merge results */
 		if (lrv != 0 && pfd_host[nfds].revents & POLLIN) {

Reply via email to