Clarify the MAP_FAILED guard comment and assert the cleared size

Explain why `addr_` is reset before `close()`: `munmap()` must not be
called with the sentinel. The test also checks `size()`, since the hazard
is a stale size paired with a sentinel `data()`.
This commit is contained in:
yhirose
2026-08-01 22:21:26 -04:00
parent 2e37c51921
commit 15a23abd7e
2 changed files with 6 additions and 7 deletions
+4 -4
View File
@@ -9347,10 +9347,9 @@ TEST(MmapTest, OpenWhileFileHeldForWriting) {
#endif
#ifndef _WIN32
// A failed ::mmap must not be reported as an open mapping. is_open() only
// compares addr_ against nullptr, so the MAP_FAILED sentinel used to pass it
// and data() handed the caller (const char *)-1. A directory opens and stats
// fine but has no mapping, so ::mmap fails for it.
// A failed ::mmap() must not be reported as an open mapping, otherwise data()
// hands the caller the MAP_FAILED sentinel. A directory is the easiest way to
// reach it, since ::open() and fstat() succeed for one but ::mmap() doesn't.
TEST(MmapTest, FailedMappingIsNotOpen) {
const char *path = "./mmap_failed_mapping_test_dir";
ASSERT_EQ(0, ::mkdir(path, 0755));
@@ -9358,6 +9357,7 @@ TEST(MmapTest, FailedMappingIsNotOpen) {
detail::mmap m(path);
EXPECT_FALSE(m.is_open());
EXPECT_EQ(0U, m.size());
EXPECT_NE(static_cast<const void *>(m.data()),
static_cast<const void *>(MAP_FAILED));
}