NetBSD mremap() returns a mapping whose grown region is not backed when
growing a shared anonymous mapping, so accessing it crashes. Reject it
with ValueError, as is already done on Linux.
(cherry picked from commit
542b98293108a84fa5d904fb6dcf8bfb5080ec93)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
with mmap.mmap(-1, start_size) as m:
m[:] = data
- if sys.platform.startswith(('linux', 'android')):
- # Can't expand a shared anonymous mapping on Linux.
- # See https://bugzilla.kernel.org/show_bug.cgi?id=8691
+ if sys.platform.startswith(('linux', 'android', 'netbsd')):
+ # Can't expand a shared anonymous mapping on Linux
+ # (see https://bugzilla.kernel.org/show_bug.cgi?id=8691)
+ # or NetBSD.
with self.assertRaises(ValueError):
m.resize(new_size)
else:
--- /dev/null
+Fix a crash in :meth:`mmap.mmap.resize` on NetBSD when growing a shared
+anonymous mapping. :meth:`!resize` now raises :exc:`ValueError` in this
+case, as it already did on Linux.
#ifdef UNIX
void *newmap;
-#ifdef __linux__
+#if defined(__linux__) || defined(__NetBSD__)
+ // Linux mremap() refuses to grow a shared anonymous mapping, and
+ // NetBSD mremap() returns a mapping whose grown region is not backed,
+ // so accessing it crashes. Reject it here in both cases.
if (self->fd == -1 && !(self->flags & MAP_PRIVATE) && new_size > self->size) {
PyErr_Format(PyExc_ValueError,
- "mmap: can't expand a shared anonymous mapping on Linux");
+ "mmap: can't expand a shared anonymous mapping");
return NULL;
}
#endif