[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [tor/master] map_anon: define a macro if it is possible for noinherit to fail.
commit 361e955cf3f852caebb63f618fbae883237bf28b
Author: Nick Mathewson <nickm@xxxxxxxxxxxxxx>
Date: Wed Mar 6 11:03:26 2019 -0500
map_anon: define a macro if it is possible for noinherit to fail.
---
src/lib/malloc/map_anon.h | 21 +++++++++++++++++++++
src/test/test_util.c | 6 ++++++
2 files changed, 27 insertions(+)
diff --git a/src/lib/malloc/map_anon.h b/src/lib/malloc/map_anon.h
index edd750082..89fb9da0f 100644
--- a/src/lib/malloc/map_anon.h
+++ b/src/lib/malloc/map_anon.h
@@ -41,6 +41,27 @@
* the child process. */
#define INHERIT_ZERO 2
+/* Here we define the NOINHERIT_CAN_FAIL macro if and only if
+ * it's possible that ANONMAP_NOINHERIT might yield inheritable memory.
+ */
+#ifdef _WIN32
+/* Windows can't fork, so NOINHERIT is never needed. */
+#elif defined(HAVE_MINHERIT)
+/* minherit() will always have a working MAP_INHERIT_NONE or MAP_INHERIT_ZERO.
+ * NOINHERIT should always work.
+ */
+#elif defined(HAVE_MADVISE)
+/* madvise() sometimes has neither MADV_DONTFORK and MADV_WIPEONFORK.
+ * We need to be ready for the possibility it failed.
+ *
+ * (Linux added DONTFORK in 2.6.16 and WIPEONFORK in 4.14. If we someday
+ * require 2.6.16 or later, we can assume that DONTFORK will work.)
+ */
+#define NOINHERIT_CAN_FAIL
+#else
+#define NOINHERIT_CAN_FAIL
+#endif
+
void *tor_mmap_anonymous(size_t sz, unsigned flags,
unsigned *inherit_result_out);
void tor_munmap_anonymous(void *mapping, size_t sz);
diff --git a/src/test/test_util.c b/src/test/test_util.c
index 039fc435c..f6085fdb9 100644
--- a/src/test/test_util.c
+++ b/src/test/test_util.c
@@ -6224,11 +6224,17 @@ test_util_map_anon_nofork(void *arg)
int ws;
waitpid(child, &ws, 0);
+#ifndef NOINHERIT_CAN_FAIL
+ /* Only if NOINHERIT_CAN_FAIL should it be possible for us to get
+ * INHERIT_KEEP behavior in this case. */
+ tt_assert(inherit, OP_NE, INHERIT_KEEP);
+#else
if (inherit == INHERIT_KEEP) {
/* Call this test "skipped", not "passed", since noinherit wasn't
* implemented. */
tt_skip();
}
+#endif
done:
tor_munmap_anonymous(ptr, sz);
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits