Merge "fix runtime issues for scripts"
diff --git a/libc/Android.mk b/libc/Android.mk
index 6863151..cc1585c 100644
--- a/libc/Android.mk
+++ b/libc/Android.mk
@@ -1178,7 +1178,7 @@
 LOCAL_SYSTEM_SHARED_LIBRARIES :=
 # Only need this for arm since libc++ uses its own unwind code that
 # doesn't mix with the other default unwind code.
-LOCAL_STATIC_LIBRARIES_arm := libunwind_llvm
+LOCAL_STATIC_LIBRARIES_arm := libunwind_llvm libc++abi
 LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
 
 # Don't install on release build
diff --git a/libc/arch-arm/bionic/__bionic_clone.S b/libc/arch-arm/bionic/__bionic_clone.S
index f5cf9e0..a268f9d 100644
--- a/libc/arch-arm/bionic/__bionic_clone.S
+++ b/libc/arch-arm/bionic/__bionic_clone.S
@@ -42,13 +42,14 @@
     # load extra parameters
     ldmfd   ip, {r4, r5, r6}
 
-    # store 'fn' and 'arg' to the child stack
-    str     r5, [r1, #-4]
-    str     r6, [r1, #-8]
+    # Push 'fn' and 'arg' onto the child stack.
+    stmdb   r1!, {r5, r6}
 
-    # System call
+    # Make the system call.
     ldr     r7, =__NR_clone
     swi     #0
+
+    # Are we the child?
     movs    r0, r0
     beq     1f
 
@@ -62,8 +63,8 @@
 1:  # The child.
     # Setting lr to 0 will make the unwinder stop at __start_thread
     mov    lr, #0
-    ldr    r0, [sp, #-4]
-    ldr    r1, [sp, #-8]
+    # Call __start_thread with the 'fn' and 'arg' we stored on the child stack.
+    pop    {r0, r1}
     b      __start_thread
 END(__bionic_clone)
 .hidden __bionic_clone
diff --git a/libc/arch-arm64/bionic/__bionic_clone.S b/libc/arch-arm64/bionic/__bionic_clone.S
index 56ac0f6..27e44e7 100644
--- a/libc/arch-arm64/bionic/__bionic_clone.S
+++ b/libc/arch-arm64/bionic/__bionic_clone.S
@@ -31,8 +31,8 @@
 // pid_t __bionic_clone(int flags, void* child_stack, pid_t* parent_tid, void* tls, pid_t* child_tid, int (*fn)(void*), void* arg);
 
 ENTRY(__bionic_clone)
-    # Copy 'fn' and 'arg' onto the child stack.
-    stp     x5, x6, [x1, #-16]
+    # Push 'fn' and 'arg' onto the child stack.
+    stp     x5, x6, [x1, #-16]!
 
     # Make the system call.
     mov     x8, __NR_clone
@@ -49,12 +49,12 @@
     ret
 
 .L_bc_child:
-    # We're in the child now. Set the end of the frame record chain...
-    mov     x29, xzr
-    # Setting x30 to 0 will make the unwinder stop at __start_thread
-    mov     x30, xzr
-    # ...and call __start_thread with the 'fn' and 'arg' we stored on the child stack.
-    ldp     x0, x1, [sp, #-16]
+    # We're in the child now. Set the end of the frame record chain.
+    mov     x29, #0
+    # Setting x30 to 0 will make the unwinder stop at __start_thread.
+    mov     x30, #0
+    # Call __start_thread with the 'fn' and 'arg' we stored on the child stack.
+    ldp     x0, x1, [sp], #16
     b       __start_thread
 END(__bionic_clone)
 .hidden __bionic_clone
diff --git a/libc/dns/gethnamaddr.c b/libc/dns/gethnamaddr.c
index 0bd838e..736858f 100644
--- a/libc/dns/gethnamaddr.c
+++ b/libc/dns/gethnamaddr.c
@@ -69,6 +69,7 @@
 #include <errno.h>
 #include <netdb.h>
 #include <stdarg.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <strings.h>
 #include <syslog.h>
@@ -532,30 +533,32 @@
 	return hp;
 }
 
-
-static FILE* android_open_proxy()
-{
-	int sock;
-	const int one = 1;
-	struct sockaddr_un proxy_addr;
-
-	sock = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
-	if (sock < 0) {
+__LIBC_HIDDEN__ FILE* android_open_proxy() {
+	const char* cache_mode = getenv("ANDROID_DNS_MODE");
+	bool use_proxy = (cache_mode == NULL || strcmp(cache_mode, "local") != 0);
+	if (!use_proxy) {
 		return NULL;
 	}
 
-	setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
+	int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
+	if (s == -1) {
+		return NULL;
+	}
+
+	const int one = 1;
+	setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
+
+	struct sockaddr_un proxy_addr;
 	memset(&proxy_addr, 0, sizeof(proxy_addr));
 	proxy_addr.sun_family = AF_UNIX;
 	strlcpy(proxy_addr.sun_path, "/dev/socket/dnsproxyd", sizeof(proxy_addr.sun_path));
-	if (TEMP_FAILURE_RETRY(connect(sock,
-			(const struct sockaddr*) &proxy_addr,
-			sizeof(proxy_addr))) != 0) {
-		close(sock);
+
+	if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*) &proxy_addr, sizeof(proxy_addr))) != 0) {
+		close(s);
 		return NULL;
 	}
 
-	return fdopen(sock, "r+");
+	return fdopen(s, "r+");
 }
 
 static struct hostent *
@@ -565,8 +568,8 @@
 	char buf[4];
 	if (fread(buf, 1, sizeof(buf), proxy) != sizeof(buf)) return NULL;
 
-	/* This is reading serialized data from system/netd/server/DnsProxyListener.cpp
-	 * and changes here need to be matched there */
+	// This is reading serialized data from system/netd/server/DnsProxyListener.cpp
+	// and changes here need to be matched there.
 	int result_code = strtol(buf, NULL, 10);
 	if (result_code != DnsProxyQueryResult) {
 		fread(&size, 1, sizeof(size), proxy);
@@ -748,80 +751,39 @@
 static struct hostent *
 gethostbyname_internal(const char *name, int af, res_state res, unsigned netid, unsigned mark)
 {
-	const char *cache_mode = getenv("ANDROID_DNS_MODE");
-	FILE* proxy = NULL;
-	struct hostent *result = NULL;
-
-	if (cache_mode != NULL && strcmp(cache_mode, "local") == 0) {
+	FILE* proxy = android_open_proxy();
+	if (proxy == NULL) {
+		// Either we're not supposed to be using the proxy or the proxy is unavailable.
 		res_setnetid(res, netid);
 		res_setmark(res, mark);
 		return gethostbyname_internal_real(name, af, res);
 	}
 
-	proxy = android_open_proxy();
-	if (proxy == NULL) goto exit;
-
 	netid = __netdClientDispatch.netIdForResolv(netid);
 
-	/* This is writing to system/netd/server/DnsProxyListener.cpp and changes
-	 * here need to be matched there */
+	// This is writing to system/netd/server/DnsProxyListener.cpp and changes
+	// here need to be matched there.
 	if (fprintf(proxy, "gethostbyname %u %s %d",
 			netid,
 			name == NULL ? "^" : name,
 			af) < 0) {
-		goto exit;
+		fclose(proxy);
+		return NULL;
 	}
 
 	if (fputc(0, proxy) == EOF || fflush(proxy) != 0) {
-		goto exit;
-	}
-
-	result = android_read_hostent(proxy);
-
-exit:
-	if (proxy != NULL) {
 		fclose(proxy);
+		return NULL;
 	}
+
+	struct hostent* result = android_read_hostent(proxy);
+	fclose(proxy);
 	return result;
 }
 
 
-struct hostent *
-android_gethostbyaddrfornet_proxy(const void *addr,
-    socklen_t len, int af, unsigned netid)
-{
-	struct hostent *result = NULL;
-	FILE* proxy = android_open_proxy();
-
-	if (proxy == NULL) goto exit;
-
-	char buf[INET6_ADDRSTRLEN];  //big enough for IPv4 and IPv6
-	const char * addrStr = inet_ntop(af, addr, buf, sizeof(buf));
-	if (addrStr == NULL) goto exit;
-
-	netid = __netdClientDispatch.netIdForResolv(netid);
-
-	if (fprintf(proxy, "gethostbyaddr %s %d %d %u",
-			addrStr, len, af, netid) < 0) {
-		goto exit;
-	}
-
-	if (fputc(0, proxy) == EOF || fflush(proxy) != 0) {
-		goto exit;
-	}
-
-	result = android_read_hostent(proxy);
-exit:
-	if (proxy != NULL) {
-		fclose(proxy);
-	}
-	return result;
-}
-
-struct hostent *
-android_gethostbyaddrfornet_real(const void *addr,
-    socklen_t len, int af, unsigned netid, unsigned mark)
-{
+static struct hostent *
+android_gethostbyaddrfornet_real(const void *addr, socklen_t len, int af, unsigned netid, unsigned mark) {
 	const u_char *uaddr = (const u_char *)addr;
 	socklen_t size;
 	struct hostent *hp;
@@ -874,16 +836,43 @@
 	return hp;
 }
 
+__LIBC_HIDDEN__ struct hostent*
+android_gethostbyaddrfornet_proxy(const void* addr, socklen_t len, int af, unsigned netid, unsigned mark) {
+	FILE* proxy = android_open_proxy();
+	if (proxy == NULL) {
+		// Either we're not supposed to be using the proxy or the proxy is unavailable.
+		return android_gethostbyaddrfornet_real(addr,len, af, netid, mark);
+	}
+
+	char buf[INET6_ADDRSTRLEN];  //big enough for IPv4 and IPv6
+	const char * addrStr = inet_ntop(af, addr, buf, sizeof(buf));
+	if (addrStr == NULL) {
+		fclose(proxy);
+		return NULL;
+	}
+
+	netid = __netdClientDispatch.netIdForResolv(netid);
+
+	if (fprintf(proxy, "gethostbyaddr %s %d %d %u",
+			addrStr, len, af, netid) < 0) {
+		fclose(proxy);
+		return NULL;
+	}
+
+	if (fputc(0, proxy) == EOF || fflush(proxy) != 0) {
+		fclose(proxy);
+		return NULL;
+	}
+
+	struct hostent *result = android_read_hostent(proxy);
+	fclose(proxy);
+	return result;
+}
+
 struct hostent *
 android_gethostbyaddrfornet(const void *addr, socklen_t len, int af, unsigned netid, unsigned mark)
 {
-	const char *cache_mode = getenv("ANDROID_DNS_MODE");
-
-	if (cache_mode == NULL || strcmp(cache_mode, "local") != 0) {
-		return android_gethostbyaddrfornet_proxy(addr, len, af, netid);
-	} else {
-		return android_gethostbyaddrfornet_real(addr,len, af, netid, mark);
-	}
+	return android_gethostbyaddrfornet_proxy(addr, len, af, netid, mark);
 }
 
 struct hostent *
diff --git a/libc/dns/include/resolv_netid.h b/libc/dns/include/resolv_netid.h
index e5521b8..1d0f869 100644
--- a/libc/dns/include/resolv_netid.h
+++ b/libc/dns/include/resolv_netid.h
@@ -34,6 +34,7 @@
  */
 #include <sys/cdefs.h>
 #include <netinet/in.h>
+#include <stdio.h>
 
 /*
  * Passing NETID_UNSET as the netId causes system/netd/server/DnsProxyListener.cpp to
@@ -68,9 +69,9 @@
 extern void _resolv_delete_cache_for_net(unsigned netid) __used_in_netd;
 
 /* Internal use only. */
-struct hostent *android_gethostbyaddrfornet_proxy(const void *, socklen_t, int , unsigned);
-int android_getnameinfofornet(const struct sockaddr *, socklen_t, char *, size_t, char *, size_t,
-		 int, unsigned, unsigned);
+struct hostent *android_gethostbyaddrfornet_proxy(const void *, socklen_t, int , unsigned, unsigned) __LIBC_HIDDEN__;
+int android_getnameinfofornet(const struct sockaddr *, socklen_t, char *, size_t, char *, size_t, int, unsigned, unsigned) __LIBC_HIDDEN__;
+FILE* android_open_proxy(void) __LIBC_HIDDEN__;
 
 /* delete the cache associated with a certain network */
 extern void _resolv_delete_cache_for_net(unsigned netid);
diff --git a/libc/dns/net/getaddrinfo.c b/libc/dns/net/getaddrinfo.c
index 1ebd222..f0d522a 100644
--- a/libc/dns/net/getaddrinfo.c
+++ b/libc/dns/net/getaddrinfo.c
@@ -423,10 +423,6 @@
     const char *hostname, const char *servname,
     const struct addrinfo *hints, struct addrinfo **res, unsigned netid)
 {
-	int sock;
-	const int one = 1;
-	struct sockaddr_un proxy_addr;
-	FILE* proxy = NULL;
 	int success = 0;
 
 	// Clear this at start, as we use its non-NULLness later (in the
@@ -442,36 +438,14 @@
 		return EAI_NODATA;
 	}
 
-	sock = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
-	if (sock < 0) {
-		return EAI_NODATA;
-	}
-
-	setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
-	memset(&proxy_addr, 0, sizeof(proxy_addr));
-	proxy_addr.sun_family = AF_UNIX;
-	strlcpy(proxy_addr.sun_path, "/dev/socket/dnsproxyd",
-		sizeof(proxy_addr.sun_path));
-	if (TEMP_FAILURE_RETRY(connect(sock,
-				       (const struct sockaddr*) &proxy_addr,
-				       sizeof(proxy_addr))) != 0) {
-		close(sock);
-		return EAI_NODATA;
+	FILE* proxy = android_open_proxy();
+	if (proxy == NULL) {
+		return EAI_SYSTEM;
 	}
 
 	netid = __netdClientDispatch.netIdForResolv(netid);
 
 	// Send the request.
-	proxy = fdopen(sock, "r+");
-	if (proxy == NULL) {
-		// Failed to map sock to FILE*. Check errno for the cause.
-		// @sonymobile.com saw failures in automated testing, but
-		// couldn't reproduce it for debugging.
-		// Fail with EAI_SYSTEM and let callers handle the failure.
-		close(sock);
-		return EAI_SYSTEM;
-	}
-
 	if (fprintf(proxy, "getaddrinfo %s %s %d %d %d %d %u",
 		    hostname == NULL ? "^" : hostname,
 		    servname == NULL ? "^" : servname,
@@ -618,7 +592,6 @@
 	struct addrinfo ai0;
 	struct addrinfo *pai;
 	const struct explore *ex;
-	const char* cache_mode = getenv("ANDROID_DNS_MODE");
 
 	/* hostname is allowed to be NULL */
 	/* servname is allowed to be NULL */
@@ -753,13 +726,12 @@
 	if (pai->ai_flags & AI_NUMERICHOST)
 		ERR(EAI_NONAME);
 
-        /*
-         * BEGIN ANDROID CHANGES; proxying to the cache
-         */
-	if (cache_mode == NULL || strcmp(cache_mode, "local") != 0) {
-		// we're not the proxy - pass the request to them
-		return android_getaddrinfo_proxy(hostname, servname, hints, res, netid);
+#if defined(__ANDROID__)
+	int gai_error = android_getaddrinfo_proxy(hostname, servname, hints, res, netid);
+	if (gai_error != EAI_SYSTEM) {
+		return gai_error;
 	}
+#endif
 
 	/*
 	 * hostname as alphabetical name.
diff --git a/libc/dns/net/getnameinfo.c b/libc/dns/net/getnameinfo.c
index b9c0280..893e982 100644
--- a/libc/dns/net/getnameinfo.c
+++ b/libc/dns/net/getnameinfo.c
@@ -303,7 +303,7 @@
 			break;
 		}
 	} else {
-		hp = android_gethostbyaddrfornet_proxy(addr, afd->a_addrlen, afd->a_af, netid);
+		hp = android_gethostbyaddrfornet_proxy(addr, afd->a_addrlen, afd->a_af, netid, mark);
 		if (hp) {
 #if 0
 			/*
diff --git a/libc/include/machine/timespec.h b/libc/include/machine/timespec.h
new file mode 100644
index 0000000..11779ae
--- /dev/null
+++ b/libc/include/machine/timespec.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _MACHINE_TIMESPEC_H_
+#define _MACHINE_TIMESPEC_H_
+
+#include <sys/types.h>
+
+/*
+ * This file is used to include timespec definition without introducing the whole
+ * <linux/time.h>, <sys/time.h> or <time.h>.
+ */
+#ifndef _STRUCT_TIMESPEC
+#define _STRUCT_TIMESPEC
+struct timespec {
+  time_t tv_sec;
+  long tv_nsec;
+};
+#endif
+
+#endif /* _MACHINE_TIMESPEC_H_ */
diff --git a/libc/include/sched.h b/libc/include/sched.h
index 4f9e2a6..930dd7c 100644
--- a/libc/include/sched.h
+++ b/libc/include/sched.h
@@ -28,10 +28,9 @@
 #ifndef _SCHED_H_
 #define _SCHED_H_
 
-#include <sys/cdefs.h>
-#include <sys/time.h>
-
 #include <linux/sched.h>
+#include <machine/timespec.h>
+#include <sys/cdefs.h>
 
 __BEGIN_DECLS
 
diff --git a/libc/include/signal.h b/libc/include/signal.h
index 867f497..9519f6d 100644
--- a/libc/include/signal.h
+++ b/libc/include/signal.h
@@ -32,8 +32,8 @@
 #include <asm/sigcontext.h>
 #include <errno.h>
 #include <limits.h>
-#include <linux/time.h>
 #include <machine/pthread_types.h>
+#include <machine/timespec.h>
 #include <string.h>
 #include <sys/cdefs.h>
 #include <sys/types.h>
diff --git a/libc/include/sys/select.h b/libc/include/sys/select.h
index 32c1206..553050b 100644
--- a/libc/include/sys/select.h
+++ b/libc/include/sys/select.h
@@ -29,11 +29,11 @@
 #ifndef _SYS_SELECT_H_
 #define _SYS_SELECT_H_
 
-#include <sys/cdefs.h>
-#include <sys/time.h>
-#include <sys/types.h>
+#include <linux/time.h>
 #include <signal.h>
 #include <string.h>
+#include <sys/cdefs.h>
+#include <sys/types.h>
 
 __BEGIN_DECLS
 
diff --git a/libc/include/sys/stat.h b/libc/include/sys/stat.h
index 7d85dd1..e3f41a9 100644
--- a/libc/include/sys/stat.h
+++ b/libc/include/sys/stat.h
@@ -29,12 +29,11 @@
 #ifndef _SYS_STAT_H_
 #define _SYS_STAT_H_
 
+#include <endian.h>
+#include <linux/stat.h>
+#include <machine/timespec.h>
 #include <sys/cdefs.h>
 #include <sys/types.h>
-#include <sys/time.h>
-#include <linux/stat.h>
-
-#include <endian.h>
 
 __BEGIN_DECLS
 
diff --git a/tests/setjmp_test.cpp b/tests/setjmp_test.cpp
index 2ea01b3..8afd494 100644
--- a/tests/setjmp_test.cpp
+++ b/tests/setjmp_test.cpp
@@ -63,15 +63,27 @@
   }
 }
 
-static sigset_t SigSetOf(int signal, int rt_signal = 0) {
-  sigset_t ss;
-  sigemptyset(&ss);
-  sigaddset(&ss, signal);
-  if (rt_signal != 0) {
-    sigaddset(&ss, rt_signal);
+// Two distinct signal sets, pipu
+struct SigSets {
+  SigSets() : one(MakeSigSet(0)), two(MakeSigSet(1)) {
   }
-  return ss;
-}
+
+  static sigset_t MakeSigSet(int offset) {
+    sigset_t ss;
+    sigemptyset(&ss);
+    sigaddset(&ss, SIGUSR1 + offset);
+#if defined(__LP64__)
+    // For arm and x86, sigset_t was too small for the RT signals.
+    // For mips, sigset_t was large enough but jmp_buf wasn't.
+    sigaddset(&ss, SIGRTMIN + offset);
+#endif
+    return ss;
+  }
+
+  sigset_t one;
+  sigset_t two;
+  sigset_t original;
+};
 
 void AssertSigmaskEquals(const sigset_t& expected) {
   sigset_t actual;
@@ -84,76 +96,68 @@
 
 TEST(setjmp, _setjmp_signal_mask) {
   // _setjmp/_longjmp do not save/restore the signal mask.
-  sigset_t ss1(SigSetOf(SIGUSR1, SIGRTMIN + 8));
-  sigset_t ss2(SigSetOf(SIGUSR2, SIGRTMIN + 9));
-  sigset_t original_set;
-  sigprocmask(SIG_SETMASK, &ss1, &original_set);
+  SigSets ss;
+  sigprocmask(SIG_SETMASK, &ss.one, &ss.original);
   jmp_buf jb;
   if (_setjmp(jb) == 0) {
-    sigprocmask(SIG_SETMASK, &ss2, NULL);
+    sigprocmask(SIG_SETMASK, &ss.two, NULL);
     _longjmp(jb, 1);
     FAIL(); // Unreachable.
   } else {
-    AssertSigmaskEquals(ss2);
+    AssertSigmaskEquals(ss.two);
   }
-  sigprocmask(SIG_SETMASK, &original_set, NULL);
+  sigprocmask(SIG_SETMASK, &ss.original, NULL);
 }
 
 TEST(setjmp, setjmp_signal_mask) {
   // setjmp/longjmp do save/restore the signal mask on bionic, but not on glibc.
   // This is a BSD versus System V historical accident. POSIX leaves the
   // behavior unspecified, so any code that cares needs to use sigsetjmp.
-  sigset_t ss1(SigSetOf(SIGUSR1, SIGRTMIN + 8));
-  sigset_t ss2(SigSetOf(SIGUSR2, SIGRTMIN + 9));
-  sigset_t original_set;
-  sigprocmask(SIG_SETMASK, &ss1, &original_set);
+  SigSets ss;
+  sigprocmask(SIG_SETMASK, &ss.one, &ss.original);
   jmp_buf jb;
   if (setjmp(jb) == 0) {
-    sigprocmask(SIG_SETMASK, &ss2, NULL);
+    sigprocmask(SIG_SETMASK, &ss.two, NULL);
     longjmp(jb, 1);
     FAIL(); // Unreachable.
   } else {
 #if defined(__BIONIC__)
     // bionic behaves like BSD and does save/restore the signal mask.
-    AssertSigmaskEquals(ss1);
+    AssertSigmaskEquals(ss.one);
 #else
     // glibc behaves like System V and doesn't save/restore the signal mask.
-    AssertSigmaskEquals(ss2);
+    AssertSigmaskEquals(ss.two);
 #endif
   }
-  sigprocmask(SIG_SETMASK, &original_set, NULL);
+  sigprocmask(SIG_SETMASK, &ss.original, NULL);
 }
 
 TEST(setjmp, sigsetjmp_0_signal_mask) {
   // sigsetjmp(0)/siglongjmp do not save/restore the signal mask.
-  sigset_t ss1(SigSetOf(SIGUSR1, SIGRTMIN + 8));
-  sigset_t ss2(SigSetOf(SIGUSR2, SIGRTMIN + 9));
-  sigset_t original_set;
-  sigprocmask(SIG_SETMASK, &ss1, &original_set);
+  SigSets ss;
+  sigprocmask(SIG_SETMASK, &ss.one, &ss.original);
   sigjmp_buf sjb;
   if (sigsetjmp(sjb, 0) == 0) {
-    sigprocmask(SIG_SETMASK, &ss2, NULL);
+    sigprocmask(SIG_SETMASK, &ss.two, NULL);
     siglongjmp(sjb, 1);
     FAIL(); // Unreachable.
   } else {
-    AssertSigmaskEquals(ss2);
+    AssertSigmaskEquals(ss.two);
   }
-  sigprocmask(SIG_SETMASK, &original_set, NULL);
+  sigprocmask(SIG_SETMASK, &ss.original, NULL);
 }
 
 TEST(setjmp, sigsetjmp_1_signal_mask) {
   // sigsetjmp(1)/siglongjmp does save/restore the signal mask.
-  sigset_t ss1(SigSetOf(SIGUSR1, SIGRTMIN + 8));
-  sigset_t ss2(SigSetOf(SIGUSR2, SIGRTMIN + 9));
-  sigset_t original_set;
-  sigprocmask(SIG_SETMASK, &ss1, &original_set);
+  SigSets ss;
+  sigprocmask(SIG_SETMASK, &ss.one, &ss.original);
   sigjmp_buf sjb;
   if (sigsetjmp(sjb, 1) == 0) {
-    sigprocmask(SIG_SETMASK, &ss2, NULL);
+    sigprocmask(SIG_SETMASK, &ss.two, NULL);
     siglongjmp(sjb, 1);
     FAIL(); // Unreachable.
   } else {
-    AssertSigmaskEquals(ss1);
+    AssertSigmaskEquals(ss.one);
   }
-  sigprocmask(SIG_SETMASK, &original_set, NULL);
+  sigprocmask(SIG_SETMASK, &ss.original, NULL);
 }