From c2e22ccb796961afecbe337dff4aac69360c98f8 Mon Sep 17 00:00:00 2001 From: Matthew Parkinson Date: Fri, 28 Feb 2025 11:12:22 +0000 Subject: [PATCH] Prevent internal errno setting escaping to the client. (#754) --- src/snmalloc/pal/pal_linux.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/snmalloc/pal/pal_linux.h b/src/snmalloc/pal/pal_linux.h index e84eabd..251aaf3 100644 --- a/src/snmalloc/pal/pal_linux.h +++ b/src/snmalloc/pal/pal_linux.h @@ -127,6 +127,7 @@ namespace snmalloc static void notify_not_using(void* p, size_t size) noexcept { + KeepErrno k; SNMALLOC_ASSERT(is_aligned_block(p, size)); // Fill memory so that when we switch the pages back on we don't make @@ -147,6 +148,7 @@ namespace snmalloc */ static void notify_do_dump(void* p, size_t size) noexcept { + KeepErrno k; madvise(p, size, MADV_DODUMP); } @@ -155,11 +157,14 @@ namespace snmalloc */ static void notify_do_not_dump(void* p, size_t size) noexcept { + KeepErrno k; madvise(p, size, MADV_DONTDUMP); } static uint64_t get_entropy64() { + KeepErrno k; + // TODO: If the system call fails then the POSIX PAL calls libc // functions that can require malloc, which may result in deadlock. @@ -249,7 +254,7 @@ namespace snmalloc template static void wait_on_address(stl::Atomic& addr, T expected) { - int backup = errno; + KeepErrno k; static_assert( sizeof(T) == sizeof(WaitingWord) && alignof(T) == alignof(WaitingWord), "T must be the same size and alignment as WaitingWord"); @@ -273,12 +278,12 @@ namespace snmalloc syscall( SYS_futex, &addr, FUTEX_WAIT_PRIVATE, expected, nullptr, nullptr, 0); } - errno = backup; } template static void notify_one_on_address(stl::Atomic& addr) { + KeepErrno k; static_assert( sizeof(T) == sizeof(WaitingWord) && alignof(T) == alignof(WaitingWord), "T must be the same size and alignment as WaitingWord"); @@ -288,6 +293,7 @@ namespace snmalloc template static void notify_all_on_address(stl::Atomic& addr) { + KeepErrno k; static_assert( sizeof(T) == sizeof(WaitingWord) && alignof(T) == alignof(WaitingWord), "T must be the same size and alignment as WaitingWord");