From cf56c4a25f7d67d1fd93cad39fa24752010caa6f Mon Sep 17 00:00:00 2001 From: Minh Vu Date: Mon, 27 Jul 2026 20:38:31 +0200 Subject: [PATCH] fix: close fd zero when mmap fails --- src/modulefinder/sentry_modulefinder_linux.c | 2 +- tests/unit/test_modulefinder.c | 30 ++++++++++++++++++++ tests/unit/tests.inc | 1 + 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/modulefinder/sentry_modulefinder_linux.c b/src/modulefinder/sentry_modulefinder_linux.c index b2f9ddd9de..7dc6884b20 100644 --- a/src/modulefinder/sentry_modulefinder_linux.c +++ b/src/modulefinder/sentry_modulefinder_linux.c @@ -74,7 +74,7 @@ sentry__mmap_file(sentry_mmap_t *rv, const char *path) return true; fail: - if (fd > 0) { + if (fd >= 0) { close(fd); } rv->ptr = NULL; diff --git a/tests/unit/test_modulefinder.c b/tests/unit/test_modulefinder.c index 563f49baeb..d19c1f7601 100644 --- a/tests/unit/test_modulefinder.c +++ b/tests/unit/test_modulefinder.c @@ -4,6 +4,9 @@ #ifdef SENTRY_PLATFORM_LINUX # include "modulefinder/sentry_modulefinder_linux.h" +# include +# include +# include #endif SENTRY_TEST(module_finder) @@ -74,6 +77,33 @@ SENTRY_TEST(module_addr) #endif } +SENTRY_TEST(mmap_file_closes_fd_zero_on_failure) +{ +#if !defined(SENTRY_PLATFORM_LINUX) + SKIP_TEST(); +#else + char tmp_path[] = "/tmp/sentry-native-mmap-XXXXXX"; + int tmp_fd = mkstemp(tmp_path); + TEST_ASSERT(tmp_fd >= 0); + close(tmp_fd); + + int saved_stdin = dup(STDIN_FILENO); + TEST_ASSERT(saved_stdin >= 0); + close(STDIN_FILENO); + + sentry_mmap_t mmap = { 0 }; + bool mapped = sentry__mmap_file(&mmap, tmp_path); + int fd_flags = fcntl(STDIN_FILENO, F_GETFD); + + dup2(saved_stdin, STDIN_FILENO); + close(saved_stdin); + unlink(tmp_path); + + TEST_CHECK(!mapped); + TEST_CHECK(fd_flags == -1); +#endif +} + SENTRY_TEST(procmaps_parser) { #if !defined(SENTRY_PLATFORM_LINUX) || __SIZEOF_POINTER__ != 8 diff --git a/tests/unit/tests.inc b/tests/unit/tests.inc index 6789e1d926..e845f07e37 100644 --- a/tests/unit/tests.inc +++ b/tests/unit/tests.inc @@ -222,6 +222,7 @@ XX(minidump_stream_types) XX(minidump_structures_packed) XX(minidump_system_info) XX(minidump_thread_structure) +XX(mmap_file_closes_fd_zero_on_failure) XX(module_addr) XX(module_finder) XX(mpack_newlines)