Skip to content
Snippets Groups Projects
Commit d811ce24 authored by Nick Mathewson's avatar Nick Mathewson :game_die:
Browse files

Add postfork support for nss

We need this in our unit tests, since otherwise NSS will notice
we've forked and start cussing us out.

I suspect we'll need a different hack for daemonizing, but this
should be enough for tinytest to work.
parent c317e78d
No related branches found
No related tags found
No related merge requests found
......@@ -25,6 +25,7 @@
#ifdef TINYTEST_LOCAL
#include "tinytest_local.h"
#endif
#define TINYTEST_POSTFORK
#include <stdio.h>
#include <stdlib.h>
......@@ -118,6 +119,12 @@ testcase_run_bare_(const struct testcase_t *testcase)
#ifndef NO_FORKING
#ifdef TINYTEST_POSTFORK
void tinytest_postfork(void);
#else
static void tinytest_postfork(void) { }
#endif
static enum outcome
testcase_run_forked_(const struct testgroup_t *group,
const struct testcase_t *testcase)
......@@ -187,6 +194,7 @@ testcase_run_forked_(const struct testgroup_t *group,
int test_r, write_r;
char b[1];
close(outcome_pipe[0]);
tinytest_postfork();
test_r = testcase_run_bare_(testcase);
assert(0<=(int)test_r && (int)test_r<=2);
b[0] = "NYS"[test_r];
......
......@@ -127,3 +127,13 @@ crypto_global_cleanup(void)
return 0;
}
/** Run operations that the crypto library requires to be happy again
* after forking. */
void
crypto_postfork(void)
{
#ifdef ENABLE_NSS
crypto_nss_postfork();
#endif
}
......@@ -24,5 +24,6 @@ int crypto_global_init(int hardwareAccel,
void crypto_thread_cleanup(void);
int crypto_global_cleanup(void);
void crypto_postfork(void);
#endif /* !defined(TOR_CRYPTO_H) */
......@@ -93,3 +93,10 @@ crypto_nss_global_cleanup(void)
{
NSS_Shutdown();
}
void
crypto_nss_postfork(void)
{
crypto_nss_global_cleanup();
crypto_nss_early_init();
}
......@@ -26,6 +26,8 @@ void crypto_nss_early_init(void);
int crypto_nss_late_init(void);
void crypto_nss_global_cleanup(void);
void crypto_nss_postfork(void);
#endif
#endif /* !defined(TOR_CRYPTO_NSS_H) */
......@@ -223,6 +223,13 @@ an_assertion_failed(void)
tinytest_set_test_failed_();
}
void tinytest_postfork(void);
void
tinytest_postfork(void)
{
crypto_postfork();
}
/** Main entry point for unit test code: parse the command line, and run
* some unit tests. */
int
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment