Chromium Code Reviews| Index: src/trusted/service_runtime/win/sel_memory.c |
| =================================================================== |
| --- src/trusted/service_runtime/win/sel_memory.c (revision 6420) |
| +++ src/trusted/service_runtime/win/sel_memory.c (working copy) |
| @@ -14,6 +14,7 @@ |
| #include <windows.h> |
| #include <string.h> |
| +#include "native_client/src/shared/platform/nacl_check.h" |
| #include "native_client/src/shared/platform/nacl_global_secure_random.h" |
| #include "native_client/src/shared/platform/nacl_log.h" |
| #include "native_client/src/shared/platform/win/xlate_system_error.h" |
| @@ -24,7 +25,50 @@ |
| #define MSGWIDTH "25" |
| +#if NACL_BUILD_SUBARCH == 32 |
| + |
| /* |
| + * This function searches for sandbox memory that has been reserved by |
| + * the parent process on our behalf. We pre-reserve the sandbox on 32-bit |
| + * systems because otherwise the address space may become fragmented, making |
| + * the large sandbox request fail. |
| + */ |
| +int NaCl_find_prereserved_sandbox_memory(void **p, |
| + size_t num_bytes) { |
| + SYSTEM_INFO sys_info; |
| + MEMORY_BASIC_INFORMATION mem; |
| + char *start; |
| + SIZE_T mem_size; |
| + |
| + GetSystemInfo(&sys_info); |
| + start = sys_info.lpMinimumApplicationAddress; |
| + while (mem_size = VirtualQuery((LPCVOID)start, &mem, sizeof(mem))) { |
|
Mark Seaborn
2011/08/16 20:18:43
I wouldn't put assignments inside while() or if().
bbudge
2011/08/16 20:35:58
Done.
|
| + CHECK(mem_size == sizeof(mem)); |
| + |
| + if (mem.State == MEM_RESERVE && |
| + mem.AllocationProtect == PAGE_NOACCESS && |
| + mem.RegionSize == num_bytes) { |
| + if (!VirtualFree(start, 0, MEM_RELEASE)) { |
| + DWORD err = GetLastError(); |
| + NaClLog(LOG_FATAL, |
| + "NaCl_find_prereserved_sandbox_memory: VirtualFree(0x%016" |
|
Mark Seaborn
2011/08/16 20:18:43
Indent args to align with '('
bbudge
2011/08/16 20:35:58
Done.
|
| + NACL_PRIxPTR", 0, MEM_RELEASE) failed " |
| + "with error 0x%X\n", |
| + (uintptr_t) start, err); |
| + } |
| + *p = start; |
| + return 0; |
| + } |
| + start += mem.RegionSize; |
| + if ((LPVOID)start >= sys_info.lpMaximumApplicationAddress) |
| + break; |
| + } |
| + return -ENOMEM; |
| +} |
| + |
| +#endif /* NACL_ARCH_CPU_32_BITS */ |
| + |
| +/* |
| * NaCl_page_free: free pages allocated with NaCl_page_alloc. |
| * Must start at allocation granularity (NACL_MAP_PAGESIZE) and |
| * number of bytes must be a multiple of allocation granularity. |
| @@ -48,8 +92,7 @@ |
| } |
| -static |
| -int NaCl_page_alloc_hint(void **p, |
| +int NaCl_page_alloc_at_addr(void **p, |
| size_t num_bytes) { |
| SYSTEM_INFO sys_info; |
| @@ -151,7 +194,7 @@ |
| *p = addr; |
| return 0; |
| retry: |
| - NaClLog(2, "NaCl_page_alloc_hint: retrying w/o hint\n"); |
| + NaClLog(2, "NaCl_page_alloc_at_addr: retrying w/o hint\n"); |
| hint = NULL; |
| } |
| @@ -161,7 +204,7 @@ |
| int NaCl_page_alloc(void **p, |
| size_t num_bytes) { |
| *p = NULL; |
| - return NaCl_page_alloc_hint(p, num_bytes); |
| + return NaCl_page_alloc_at_addr(p, num_bytes); |
| } |
| /* |
| @@ -203,7 +246,7 @@ |
| NaClLog(LOG_INFO, "NaCl_page_alloc_randomized: hint 0x%"NACL_PRIxPTR"\n", |
| (uintptr_t) *p); |
| - neg_errno = NaCl_page_alloc_hint(p, size); |
| + neg_errno = NaCl_page_alloc_at_addr(p, size); |
| if (0 == neg_errno) { |
| break; |
| } |
| @@ -213,7 +256,7 @@ |
| "NaCl_page_alloc_randomized: failed (%d), dropping hints\n", |
| -neg_errno); |
| *p = 0; |
| - neg_errno = NaCl_page_alloc_hint(p, size); |
| + neg_errno = NaCl_page_alloc_at_addr(p, size); |
| } |
| return neg_errno; |
| } |