15 #if !defined(_GNU_SOURCE)
16 #define _GNU_SOURCE // needed for madvise() and MAP_ANONYMOUS on Linux.
23 #if defined(OPENSSL_LINUX)
30 #include "../delocate.h"
31 #include "../../internal.h"
34 #if defined(MADV_WIPEONFORK)
37 #define MADV_WIPEONFORK 18
46 static void init_fork_detect(
void) {
47 if (*g_ignore_madv_wipeonfork_bss_get()) {
51 long page_size = sysconf(_SC_PAGESIZE);
56 void *
addr = mmap(NULL, (
size_t)page_size, PROT_READ | PROT_WRITE,
57 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
58 if (
addr == MAP_FAILED) {
67 if (madvise(
addr, (
size_t)page_size, -1) == 0 ||
68 madvise(
addr, (
size_t)page_size, MADV_WIPEONFORK) != 0) {
69 munmap(
addr, (
size_t)page_size);
73 *((
volatile char *)
addr) = 1;
74 *g_fork_detect_addr_bss_get() =
addr;
75 *g_fork_generation_bss_get() = 1;
91 CRYPTO_once(g_fork_detect_once_bss_get(), init_fork_detect);
95 volatile char *
const flag_ptr = *g_fork_detect_addr_bss_get();
96 if (flag_ptr == NULL) {
102 uint64_t *
const generation_ptr = g_fork_generation_bss_get();
105 uint64_t current_generation = *generation_ptr;
108 return current_generation;
113 current_generation = *generation_ptr;
114 if (*flag_ptr == 0) {
118 current_generation++;
119 if (current_generation == 0) {
120 current_generation = 1;
122 *generation_ptr = current_generation;
126 return current_generation;
130 *g_ignore_madv_wipeonfork_bss_get() = 1;
133 #else // !OPENSSL_LINUX
137 #endif // OPENSSL_LINUX