From 6c5ffba18e93d6eec3cfa33c2c2f0847d8599751 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Mon, 5 Aug 2024 12:39:17 +1000 Subject: [PATCH] MemMap: Fix object leak on fallocate() failure --- src/common/memmap.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/common/memmap.cpp b/src/common/memmap.cpp index 9929d526e..bcd73d262 100644 --- a/src/common/memmap.cpp +++ b/src/common/memmap.cpp @@ -644,7 +644,8 @@ void* MemMap::CreateSharedMemory(const char* name, size_t size, Error* error) } // we're not going to be opening this mapping in other processes, so remove the file - shm_unlink(name); + if (!is_anonymous) + shm_unlink(name); #endif // use fallocate() to ensure we don't SIGBUS later on. @@ -652,6 +653,9 @@ void* MemMap::CreateSharedMemory(const char* name, size_t size, Error* error) if (fallocate(fd, 0, 0, static_cast(size)) < 0) { Error::SetErrno(error, TinyString::from_format("fallocate({}) failed: ", size), errno); + close(fd); + if (!is_anonymous) + shm_unlink(name); return nullptr; } #else @@ -659,6 +663,9 @@ void* MemMap::CreateSharedMemory(const char* name, size_t size, Error* error) if (ftruncate(fd, static_cast(size)) < 0) { Error::SetErrno(error, TinyString::from_format("ftruncate({}) failed: ", size), errno); + close(fd); + if (!is_anonymous) + shm_unlink(name); return nullptr; } #endif