map_anon: define a macro if it is possible for noinherit to fail.

This commit is contained in:
Nick Mathewson 2019-03-06 11:03:26 -05:00
parent 12205c3cbe
commit 361e955cf3
2 changed files with 27 additions and 0 deletions

View File

@ -41,6 +41,27 @@
* the child process. */ * the child process. */
#define INHERIT_ZERO 2 #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, void *tor_mmap_anonymous(size_t sz, unsigned flags,
unsigned *inherit_result_out); unsigned *inherit_result_out);
void tor_munmap_anonymous(void *mapping, size_t sz); void tor_munmap_anonymous(void *mapping, size_t sz);

View File

@ -6224,11 +6224,17 @@ test_util_map_anon_nofork(void *arg)
int ws; int ws;
waitpid(child, &ws, 0); 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) { if (inherit == INHERIT_KEEP) {
/* Call this test "skipped", not "passed", since noinherit wasn't /* Call this test "skipped", not "passed", since noinherit wasn't
* implemented. */ * implemented. */
tt_skip(); tt_skip();
} }
#endif
done: done:
tor_munmap_anonymous(ptr, sz); tor_munmap_anonymous(ptr, sz);