Преглед на файлове

Merge branch 'mmap-map-failed-guard' of github.com:metsw24-max/cpp-httplib into metsw24-max-mmap-map-failed-guard

yhirose преди 1 седмица
родител
ревизия
2e37c51921
променени са 2 файла, в които са добавени 26 реда и са изтрити 0 реда
  1. 9 0
      httplib.h
  2. 17 0
      test/test.cc

+ 9 - 0
httplib.h

@@ -5576,6 +5576,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;

+ 17 - 0
test/test.cc

@@ -9346,6 +9346,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;