Skip to content

Commit 39e9c6b

Browse files
wscho77janvorli
andauthored
Return NULL for mmap fail case on Unix (#78069)
* Return NULL for mmap fail case on Unix If mmap failed, "MAP_FAILED" is returned not "NULL". The windows implememtation of GetRWMapping returns "NULL" for fail case, and the caller function is also checking "NULL". So, change Unix implementation to return "NULL" for fail case. * call memset when mmap succeeds * check MAP_FAILED instead of NULL * return false for failing mmap * Call g_fatalErrorHandler if releasing failed * Update src/coreclr/utilcode/executableallocator.cpp Co-authored-by: Jan Vorlicek <jan.vorlicek@volny.cz> * Fix wrong condition check Co-authored-by: Jan Vorlicek <jan.vorlicek@volny.cz>
1 parent db21365 commit 39e9c6b

File tree

3 files changed

+15
-4
lines changed

3 files changed

+15
-4
lines changed

src/coreclr/minipal/Unix/doublemapping.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,10 @@ bool VMToOSInterface::ReleaseDoubleMappedMemory(void *mapperHandle, void* pStart
198198
{
199199
#ifndef TARGET_OSX
200200
int fd = (int)(size_t)mapperHandle;
201-
mmap(pStart, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, offset);
201+
if (mmap(pStart, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, offset) == MAP_FAILED)
202+
{
203+
return false;
204+
}
202205
memset(pStart, 0, size);
203206
#endif // TARGET_OSX
204207
return munmap(pStart, size) != -1;
@@ -208,7 +211,12 @@ void* VMToOSInterface::GetRWMapping(void *mapperHandle, void* pStart, size_t off
208211
{
209212
#ifndef TARGET_OSX
210213
int fd = (int)(size_t)mapperHandle;
211-
return mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset);
214+
void* result = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset);
215+
if (result == MAP_FAILED)
216+
{
217+
result = NULL;
218+
}
219+
return result;
212220
#else // TARGET_OSX
213221
#ifdef TARGET_AMD64
214222
vm_address_t startRW;

src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -743,7 +743,7 @@ REDHAWK_PALEXPORT _Ret_maybenull_ _Post_writable_byte_size_(size) void* REDHAWK_
743743

744744
void * pRetVal = mmap(pAddress, alignedSize, unixProtect, flags, -1, 0);
745745

746-
if (pRetVal != NULL)
746+
if (pRetVal != MAP_FAILED)
747747
{
748748
void * pAlignedRetVal = (void *)(((size_t)pRetVal + (Alignment - 1)) & ~(Alignment - 1));
749749
size_t startPadding = (size_t)pAlignedRetVal - (size_t)pRetVal;

src/coreclr/utilcode/executableallocator.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,10 @@ void ExecutableAllocator::Release(void* pRX)
453453

454454
if (pBlock != NULL)
455455
{
456-
VMToOSInterface::ReleaseDoubleMappedMemory(m_doubleMemoryMapperHandle, pRX, pBlock->offset, pBlock->size);
456+
if (!VMToOSInterface::ReleaseDoubleMappedMemory(m_doubleMemoryMapperHandle, pRX, pBlock->offset, pBlock->size))
457+
{
458+
g_fatalErrorHandler(COR_E_EXECUTIONENGINE, W("Releasing the double mapped memory failed"));
459+
}
457460
// Put the released block into the free block list
458461
pBlock->baseRX = NULL;
459462
pBlock->next = m_pFirstFreeBlockRX;

0 commit comments

Comments
 (0)