Module Name: src Committed By: kamil Date: Sat Feb 1 15:38:46 UTC 2020
Modified Files: src/lib/libc/gen: pthread_atfork.c Log Message: Switch atform allocations from malloc()+free() to mmap()+munmap() This avoid bootstrapping malloc too early when libc+libpthread are not ready. It is called through pthread__init() -> _pthread_atfork(). This also helps LLVM Leak Sanitizer to pacify false positive reports. To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/lib/libc/gen/pthread_atfork.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/gen/pthread_atfork.c diff -u src/lib/libc/gen/pthread_atfork.c:1.10 src/lib/libc/gen/pthread_atfork.c:1.11 --- src/lib/libc/gen/pthread_atfork.c:1.10 Tue Jan 20 18:31:25 2015 +++ src/lib/libc/gen/pthread_atfork.c Sat Feb 1 15:38:46 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: pthread_atfork.c,v 1.10 2015/01/20 18:31:25 christos Exp $ */ +/* $NetBSD: pthread_atfork.c,v 1.11 2020/02/01 15:38:46 kamil Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -31,15 +31,17 @@ #include <sys/cdefs.h> #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: pthread_atfork.c,v 1.10 2015/01/20 18:31:25 christos Exp $"); +__RCSID("$NetBSD: pthread_atfork.c,v 1.11 2020/02/01 15:38:46 kamil Exp $"); #endif /* LIBC_SCCS and not lint */ #include "namespace.h" +#include <sys/types.h> +#include <sys/mman.h> +#include <sys/queue.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> -#include <sys/queue.h> #include "reentrant.h" #ifdef __weak_alias @@ -73,11 +75,22 @@ static struct atfork_callback_q childq = static struct atfork_callback * af_alloc(void) { + void *arena; + size_t sz; if (atfork_builtin.fn == NULL) return &atfork_builtin; - return malloc(sizeof(atfork_builtin)); + /* + * Avoid using here malloc() as this function is used on early init + * and can prematuraly initialize the malloc library. + * malloc() allocations here also confuse the LLVM Leak Sanitizer. + */ + sz = sizeof(atfork_builtin); + arena = mmap(NULL, sz, PROT_READ|PROT_WRITE, MAP_ANON, -1, 0); + if (arena == MAP_FAILED) + return NULL; + return arena; } static void @@ -85,7 +98,7 @@ af_free(struct atfork_callback *af) { if (af != &atfork_builtin) - free(af); + munmap(af, sizeof(atfork_builtin)); } int