aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2009-04-05 00:56:30 -0400
committerMike Frysinger <vapier@gentoo.org>2009-04-05 03:54:05 -0400
commit4f5ba92246606723806c0585393f21244d44036c (patch)
tree8faf05e0b33f28068c3cafff95694446a3b504a6 /libsandbox/wrapper-funcs
parenttests: add some tracing tests (diff)
downloadsandbox-4f5ba92246606723806c0585393f21244d44036c.tar.gz
sandbox-4f5ba92246606723806c0585393f21244d44036c.tar.bz2
sandbox-4f5ba92246606723806c0585393f21244d44036c.zip
libsandbox: force lock sanity across forks
Classic example of forks being used in multithreaded applications and causing havoc with shared state (locks in this case). Make sure that threads grabbing the sandbox lock don't screw up threads that do a fork and then exec. URL: http://bugs.gentoo.org/263657 Signed-off-by: Mike Frysinger <vapier@gentoo.org> Reported-by: Ryan Hope <rmh3093@gmail.com>
Diffstat (limited to 'libsandbox/wrapper-funcs')
-rw-r--r--libsandbox/wrapper-funcs/fork.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/libsandbox/wrapper-funcs/fork.c b/libsandbox/wrapper-funcs/fork.c
new file mode 100644
index 0000000..c250018
--- /dev/null
+++ b/libsandbox/wrapper-funcs/fork.c
@@ -0,0 +1,24 @@
+/*
+ * fork() wrapper.
+ *
+ * Copyright 1999-2009 Gentoo Foundation
+ * Licensed under the GPL-2
+ */
+
+/* We're only wrapping fork() as a poor man's pthread_atfork(). That would
+ * require dedicated linkage against libpthread. So here we force the locks
+ * to a consistent state before forking. #263657
+ */
+
+#define WRAPPER_ARGS_PROTO
+#define WRAPPER_ARGS
+#define WRAPPER_SAFE() 0
+#define WRAPPER_PRE_CHECKS() \
+({ \
+ /* pthread_atfork(sb_lock, sb_unlock, sb_unlock); */ \
+ sb_lock(); \
+ result = SB_HIDDEN_FUNC(WRAPPER_NAME)(WRAPPER_ARGS_FULL); \
+ sb_unlock(); \
+ false; \
+})
+#include "__wrapper_simple.c"