MemMap: Fix object leak on fallocate() failure

This commit is contained in:
Stenzek 2024-08-05 12:39:17 +10:00
parent 79bb5f079c
commit 6c5ffba18e
No known key found for this signature in database

View file

@ -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 // 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 #endif
// use fallocate() to ensure we don't SIGBUS later on. // 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<off_t>(size)) < 0) if (fallocate(fd, 0, 0, static_cast<off_t>(size)) < 0)
{ {
Error::SetErrno(error, TinyString::from_format("fallocate({}) failed: ", size), errno); Error::SetErrno(error, TinyString::from_format("fallocate({}) failed: ", size), errno);
close(fd);
if (!is_anonymous)
shm_unlink(name);
return nullptr; return nullptr;
} }
#else #else
@ -659,6 +663,9 @@ void* MemMap::CreateSharedMemory(const char* name, size_t size, Error* error)
if (ftruncate(fd, static_cast<off_t>(size)) < 0) if (ftruncate(fd, static_cast<off_t>(size)) < 0)
{ {
Error::SetErrno(error, TinyString::from_format("ftruncate({}) failed: ", size), errno); Error::SetErrno(error, TinyString::from_format("ftruncate({}) failed: ", size), errno);
close(fd);
if (!is_anonymous)
shm_unlink(name);
return nullptr; return nullptr;
} }
#endif #endif