mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 12:32:40 +02:00
In jitTransitionToWritable() and jitTransitionToExecutable(), only run the JitType_CodeMemory handling code when it's actually needed. Actually free j->rx_addr in jitClose() for JitType_JitMemory.
This commit is contained in:
parent
a12eb11eab
commit
b11288ea44
@ -20,6 +20,7 @@ typedef struct {
|
||||
void* src_addr;
|
||||
void* rx_addr;
|
||||
void* rw_addr;
|
||||
bool is_executable;
|
||||
Handle handle;
|
||||
} Jit;
|
||||
|
||||
|
@ -40,6 +40,7 @@ Result jitCreate(Jit* j, size_t size)
|
||||
j->src_addr = src_addr;
|
||||
j->rx_addr = virtmemReserve(j->size);
|
||||
j->handle = INVALID_HANDLE;
|
||||
j->is_executable = 0;
|
||||
|
||||
Result rc = 0;
|
||||
|
||||
@ -94,7 +95,7 @@ Result jitTransitionToWritable(Jit* j)
|
||||
|
||||
switch (j->type) {
|
||||
case JitType_CodeMemory:
|
||||
rc = svcUnmapProcessCodeMemory(envGetOwnProcessHandle(), (u64) j->rx_addr, (u64) j->src_addr, j->size);
|
||||
if (j->is_executable) rc = svcUnmapProcessCodeMemory(envGetOwnProcessHandle(), (u64) j->rx_addr, (u64) j->src_addr, j->size);
|
||||
break;
|
||||
|
||||
case JitType_JitMemory:
|
||||
@ -102,6 +103,8 @@ Result jitTransitionToWritable(Jit* j)
|
||||
break;
|
||||
}
|
||||
|
||||
if (R_SUCCEEDED(rc)) j->is_executable = 0;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -111,13 +114,15 @@ Result jitTransitionToExecutable(Jit* j)
|
||||
|
||||
switch (j->type) {
|
||||
case JitType_CodeMemory:
|
||||
rc = svcMapProcessCodeMemory(envGetOwnProcessHandle(), (u64) j->rx_addr, (u64) j->src_addr, j->size);
|
||||
if (!j->is_executable) {
|
||||
rc = svcMapProcessCodeMemory(envGetOwnProcessHandle(), (u64) j->rx_addr, (u64) j->src_addr, j->size);
|
||||
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
rc = svcSetProcessMemoryPermission(envGetOwnProcessHandle(), (u64) j->rx_addr, j->size, Perm_Rx);
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
rc = svcSetProcessMemoryPermission(envGetOwnProcessHandle(), (u64) j->rx_addr, j->size, Perm_Rx);
|
||||
|
||||
if (R_FAILED(rc)) {
|
||||
jitTransitionToWritable(j);
|
||||
if (R_FAILED(rc)) {
|
||||
jitTransitionToWritable(j);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -128,6 +133,8 @@ Result jitTransitionToExecutable(Jit* j)
|
||||
break;
|
||||
}
|
||||
|
||||
if (R_SUCCEEDED(rc)) j->is_executable = 1;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -154,7 +161,7 @@ Result jitClose(Jit* j)
|
||||
rc = svcControlCodeMemory(j->handle, CodeMapOperation_UnmapSlave, j->rx_addr, j->size, 0);
|
||||
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
virtmemFree(j->rw_addr, j->size);
|
||||
virtmemFree(j->rx_addr, j->size);
|
||||
svcCloseHandle(j->handle);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user