diff --git a/Include/internal/pycore_mmap.h b/Include/internal/pycore_mmap.h index d5864416781414..897816db01077f 100644 --- a/Include/internal/pycore_mmap.h +++ b/Include/internal/pycore_mmap.h @@ -17,26 +17,27 @@ extern "C" { #endif #if defined(HAVE_PR_SET_VMA_ANON_NAME) && defined(__linux__) -static inline void +static inline int _PyAnnotateMemoryMap(void *addr, size_t size, const char *name) { #ifndef Py_DEBUG if (!_Py_GetConfig()->dev_mode) { - return; + return 0; } #endif // The name length cannot exceed 80 (including the '\0'). assert(strlen(name) < 80); - int old_errno = errno; - prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, (unsigned long)addr, size, name); - /* Ignore errno from prctl */ - /* See: https://bugzilla.redhat.com/show_bug.cgi?id=2302746 */ - errno = old_errno; + int res = prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, (unsigned long)addr, size, name); + if (res < 0) { + return -1; + } + return 0; } #else -static inline void +static inline int _PyAnnotateMemoryMap(void *Py_UNUSED(addr), size_t Py_UNUSED(size), const char *Py_UNUSED(name)) { + return 0; } #endif diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index f48541426d56f7..aad916ecfe2c27 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -6,6 +6,7 @@ from test.support.import_helper import import_module from test.support.os_helper import TESTFN, unlink from test.support.script_helper import assert_python_ok +import errno import unittest import os import re @@ -1171,7 +1172,17 @@ def test_set_name(self): # Test setting name on anonymous mmap m = mmap.mmap(-1, PAGESIZE) self.addCleanup(m.close) - result = m.set_name('test_mapping') + try: + result = m.set_name('test_mapping') + except OSError as exc: + if exc.errno == errno.EINVAL: + # gh-142419: On Fedora, prctl(PR_SET_VMA_ANON_NAME) fails with + # EINVAL because the kernel option CONFIG_ANON_VMA_NAME is + # disabled. + # See: https://bugzilla.redhat.com/show_bug.cgi?id=2302746 + self.skipTest("prctl() failed with EINVAL") + else: + raise self.assertIsNone(result) # Test name length limit (80 chars including prefix "cpython:mmap:" and '\0') diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 92f610bc9c9974..ea20fb29c90228 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -1138,7 +1138,10 @@ mmap_mmap_set_name_impl(mmap_object *self, const char *name) if (self->flags & MAP_ANONYMOUS) { char buf[80]; sprintf(buf, "%s%s", prefix, name); - _PyAnnotateMemoryMap(self->data, self->size, buf); + if (_PyAnnotateMemoryMap(self->data, self->size, buf) < 0) { + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } Py_RETURN_NONE; } else { @@ -1993,7 +1996,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) } #ifdef MAP_ANONYMOUS if (m_obj->flags & MAP_ANONYMOUS) { - _PyAnnotateMemoryMap(m_obj->data, map_size, "cpython:mmap"); + (void)_PyAnnotateMemoryMap(m_obj->data, map_size, "cpython:mmap"); } #endif m_obj->access = (access_mode)access; diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index b1f9fa2e692265..c4ccc9e283feb3 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -468,7 +468,7 @@ _PyMem_ArenaAlloc(void *Py_UNUSED(ctx), size_t size) if (ptr == MAP_FAILED) return NULL; assert(ptr != NULL); - _PyAnnotateMemoryMap(ptr, size, "cpython:pymalloc"); + (void)_PyAnnotateMemoryMap(ptr, size, "cpython:pymalloc"); return ptr; #else return malloc(size); diff --git a/Python/jit.c b/Python/jit.c index b0d53d156fa440..ca3a201e6c558d 100644 --- a/Python/jit.c +++ b/Python/jit.c @@ -77,7 +77,7 @@ jit_alloc(size_t size) unsigned char *memory = mmap(NULL, size, prot, flags, -1, 0); int failed = memory == MAP_FAILED; if (!failed) { - _PyAnnotateMemoryMap(memory, size, "cpython:jit"); + (void)_PyAnnotateMemoryMap(memory, size, "cpython:jit"); } #endif if (failed) { diff --git a/Python/perf_jit_trampoline.c b/Python/perf_jit_trampoline.c index af7d8f9f1ec0ae..0ffa906d85cc6b 100644 --- a/Python/perf_jit_trampoline.c +++ b/Python/perf_jit_trampoline.c @@ -1086,7 +1086,8 @@ static void* perf_map_jit_init(void) { close(fd); return NULL; // Memory mapping failed } - _PyAnnotateMemoryMap(perf_jit_map_state.mapped_buffer, page_size, "cpython:perf_jit_trampoline"); + (void)_PyAnnotateMemoryMap(perf_jit_map_state.mapped_buffer, page_size, + "cpython:perf_jit_trampoline"); #endif perf_jit_map_state.mapped_size = page_size; diff --git a/Python/perf_trampoline.c b/Python/perf_trampoline.c index 669a47ae17377a..335d8ac7dadd10 100644 --- a/Python/perf_trampoline.c +++ b/Python/perf_trampoline.c @@ -291,7 +291,7 @@ new_code_arena(void) perf_status = PERF_STATUS_FAILED; return -1; } - _PyAnnotateMemoryMap(memory, mem_size, "cpython:perf_trampoline"); + (void)_PyAnnotateMemoryMap(memory, mem_size, "cpython:perf_trampoline"); void *start = &_Py_trampoline_func_start; void *end = &_Py_trampoline_func_end; size_t code_size = end - start;