[tor-commits] [torsocks/master] Support certain Linux specific syscalls.

dgoulet at torproject.org dgoulet at torproject.org
Wed Apr 22 20:13:25 UTC 2015


commit e428ae4bbea17cab194a8c3acd99bc44614b0901
Author: Yawning Angel <yawning at schwanenlied.me>
Date:   Sat Mar 28 13:55:55 2015 +0000

    Support certain Linux specific syscalls.
    
    This adds support for the following non-portable Linux-isms:
     * gettid(2)
     * getrandom(2)
     * futex(2)
    
    The futex(2) support assumes a semi-modern kernel (>= 2.6.7) as the
    futex system call had an extra argument added at that time.
    
    Signed-off-by: Yawning Angel <yawning at schwanenlied.me>
---
 src/common/compat.h |   12 ++++++++++
 src/lib/syscall.c   |   61 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 73 insertions(+)

diff --git a/src/common/compat.h b/src/common/compat.h
index 766b1fd..6fca641 100644
--- a/src/common/compat.h
+++ b/src/common/compat.h
@@ -84,6 +84,15 @@ void tsocks_mutex_unlock(tsocks_mutex_t *m);
 #ifndef __NR_recvmsg
 #define __NR_recvmsg -9
 #endif
+#ifndef __NR_gettid
+#define __NR_gettid -10
+#endif
+#ifndef __NR_getrandom
+#define __NR_getrandom -11
+#endif
+#ifndef __NR_futex
+#define __NR_futex -12
+#endif
 
 #define TSOCKS_NR_SOCKET    __NR_socket
 #define TSOCKS_NR_CONNECT   __NR_connect
@@ -94,6 +103,9 @@ void tsocks_mutex_unlock(tsocks_mutex_t *m);
 #define TSOCKS_NR_GETPEERNAME __NR_getpeername
 #define TSOCKS_NR_LISTEN    __NR_listen
 #define TSOCKS_NR_RECVMSG   __NR_recvmsg
+#define TSOCKS_NR_GETTID    __NR_gettid
+#define TSOCKS_NR_GETRANDOM __NR_getrandom
+#define TSOCKS_NR_FUTEX     __NR_futex
 
 #endif /* __linux__ */
 
diff --git a/src/lib/syscall.c b/src/lib/syscall.c
index ec10000..52ee4c2 100644
--- a/src/lib/syscall.c
+++ b/src/lib/syscall.c
@@ -164,6 +164,56 @@ static LIBC_RECVMSG_RET_TYPE handle_recvmsg(va_list args)
 	return tsocks_recvmsg(sockfd, msg, flags);
 }
 
+#if defined(__linux__)
+/*
+ * Handle gettid(2) syscall.
+ */
+static LIBC_SYSCALL_RET_TYPE handle_gettid(void)
+{
+	return tsocks_libc_syscall(TSOCKS_NR_GETTID);
+}
+
+/*
+ * Handle getrandom(2) syscall.
+ */
+static LIBC_SYSCALL_RET_TYPE handle_getrandom(va_list args)
+{
+	void *buf;
+	size_t buflen;
+	unsigned int flags;
+
+	buf = va_arg(args, __typeof__(buf));
+	buflen = va_arg(args, __typeof__(buflen));
+	flags = va_arg(args, __typeof__(flags));
+
+	return tsocks_libc_syscall(TSOCKS_NR_GETRANDOM, buf, buflen, flags);
+}
+
+/*
+ * Handle futex(2) syscall.
+ */
+static LIBC_SYSCALL_RET_TYPE handle_futex(va_list args)
+{
+	/* This assumes Linux 2.6.7 or later, as that is when 'val3' was
+	 * added to futex(2).  Kernel versions prior to that are what I
+	 * would consider historic.
+	 */
+	const struct timespec *timeout;
+	int *uaddr, *uaddr2;
+	int op, val, val3;
+
+	uaddr = va_arg(args, __typeof__(uaddr));
+	op = va_arg(args, __typeof__(op));
+	val = va_arg(args, __typeof__(val));
+	timeout = va_arg(args, __typeof__(timeout));
+	uaddr2 = va_arg(args, __typeof__(uaddr2));
+	val3 = va_arg(args, __typeof__(val3));
+
+	return tsocks_libc_syscall(TSOCKS_NR_FUTEX, uaddr, op, val, timeout,
+			uaddr2, val3);
+}
+#endif /* __linux__ */
+
 /*
  * Torsocks call for syscall(2)
  */
@@ -228,6 +278,17 @@ LIBC_SYSCALL_RET_TYPE tsocks_syscall(long int number, va_list args)
 	case TSOCKS_NR_RECVMSG:
 		ret = handle_recvmsg(args);
 		break;
+#if defined(__linux__)
+	case TSOCKS_NR_GETTID:
+		ret = handle_gettid();
+		break;
+	case TSOCKS_NR_GETRANDOM:
+		ret = handle_getrandom(args);
+		break;
+	case TSOCKS_NR_FUTEX:
+		ret = handle_futex(args);
+		break;
+#endif /* __linux__ */
 	default:
 		/*
 		 * Because of the design of syscall(), we can't pass a va_list to it so





More information about the tor-commits mailing list