Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions httplib.h
Original file line number Diff line number Diff line change
Expand Up @@ -5568,6 +5568,15 @@ inline bool mmap::open(const char *path) {
is_open_empty_file = true;
return false;
}

// A failed mapping must not be left in `addr_`: `is_open()` only compares it
// against nullptr, so the MAP_FAILED sentinel would pass and `data()` would
// hand the caller (const char *)-1.
if (addr_ == MAP_FAILED) {
addr_ = nullptr;
close();
return false;
}
#endif

return true;
Expand Down
17 changes: 17 additions & 0 deletions test/test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9163,6 +9163,23 @@ 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.
TEST(MmapTest, FailedMappingIsNotOpen) {
const char *path = "./mmap_failed_mapping_test_dir";
ASSERT_EQ(0, ::mkdir(path, 0755));
auto dir_cleanup = detail::scope_exit([&] { ::rmdir(path); });

detail::mmap m(path);
EXPECT_FALSE(m.is_open());
EXPECT_NE(static_cast<const void *>(m.data()),
static_cast<const void *>(MAP_FAILED));
}
#endif

TEST(KeepAliveTest, ReadTimeout) {
Server svr;

Expand Down
Loading