commit 361e955cf3f852caebb63f618fbae883237bf28b Author: Nick Mathewson nickm@torproject.org 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@lists.torproject.org