Skip to content

Commit

Permalink
Prevent internal errno setting escaping to the client.
Browse files Browse the repository at this point in the history
  • Loading branch information
mjp41 committed Feb 27, 2025
1 parent 06df9dd commit 27a5e46
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions src/snmalloc/pal/pal_linux.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ namespace snmalloc

static void notify_not_using(void* p, size_t size) noexcept
{
KeepErrno k;
SNMALLOC_ASSERT(is_aligned_block<page_size>(p, size));

// Fill memory so that when we switch the pages back on we don't make
Expand All @@ -147,6 +148,7 @@ namespace snmalloc
*/
static void notify_do_dump(void* p, size_t size) noexcept
{
KeepErrno k;
madvise(p, size, MADV_DODUMP);
}

Expand All @@ -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.

Expand Down Expand Up @@ -249,7 +254,7 @@ namespace snmalloc
template<class T>
static void wait_on_address(stl::Atomic<T>& 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");
Expand All @@ -273,12 +278,12 @@ namespace snmalloc
syscall(
SYS_futex, &addr, FUTEX_WAIT_PRIVATE, expected, nullptr, nullptr, 0);
}
errno = backup;
}

template<class T>
static void notify_one_on_address(stl::Atomic<T>& addr)
{
KeepErrno k;
static_assert(
sizeof(T) == sizeof(WaitingWord) && alignof(T) == alignof(WaitingWord),
"T must be the same size and alignment as WaitingWord");
Expand All @@ -288,6 +293,7 @@ namespace snmalloc
template<class T>
static void notify_all_on_address(stl::Atomic<T>& addr)
{
KeepErrno k;
static_assert(
sizeof(T) == sizeof(WaitingWord) && alignof(T) == alignof(WaitingWord),
"T must be the same size and alignment as WaitingWord");
Expand Down

0 comments on commit 27a5e46

Please sign in to comment.