diff --git a/src/modulefinder/sentry_modulefinder_linux.c b/src/modulefinder/sentry_modulefinder_linux.c index b2f9ddd9d..7dc6884b2 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 563f49bae..d19c1f760 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 6789e1d92..e845f07e3 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)