Loading src/secureid.c +49 −2 Original line number Diff line number Diff line Loading @@ -48,11 +48,58 @@ __attribute__((visibility("hidden"))) uint32_t string2uint32_t(const char* str,i return res; }; #if defined(__LP64__) && !defined(__x86_64__) __attribute__((visibility("hidden"))) static uintptr_t next_mem_pos_; #endif __attribute__((visibility("hidden"))) uint32_t map32(uint32_t size){ #ifdef X86_64 return mmap(0,size,PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_32BIT, -1, 0); #else return mmap(0,size,PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); #endif #if defined(__LP64__) && !defined(__x86_64__) // MAP_32BIT only available on x86_64. void* actual = MAP_FAILED; std::string strerr; if (low_4gb && expected == nullptr) { flags |= MAP_FIXED; for (uintptr_t ptr = next_mem_pos; ptr < 4 * GB; ptr += kPageSize) { uintptr_t tail_ptr; // Check pages are free. bool safe = true; for (tail_ptr = ptr; tail_ptr < ptr + page_aligned_byte_count; tail_ptr += kPageSize) { if (msync(reinterpret_cast<void*>(tail_ptr), kPageSize, 0) == 0) { safe = false; break; } else { DCHECK_EQ(errno, ENOMEM); } } next_mem_pos_ = tail_ptr; // update early, as we break out when we found and mapped a region if (safe == true) { actual = mmap(reinterpret_cast<void*>(ptr), page_aligned_byte_count, prot, flags, fd.get(), 0); if (actual != MAP_FAILED) { break; } } else { // Skip over last page. ptr = tail_ptr; } } if (actual == MAP_FAILED) { strerr = "Could not find contiguous low-memory space."; } } else { actual = mmap(expected, page_aligned_byte_count, prot, flags, fd.get(), 0); strerr = strerror(errno); } return actual; #endif }; Loading Loading
src/secureid.c +49 −2 Original line number Diff line number Diff line Loading @@ -48,11 +48,58 @@ __attribute__((visibility("hidden"))) uint32_t string2uint32_t(const char* str,i return res; }; #if defined(__LP64__) && !defined(__x86_64__) __attribute__((visibility("hidden"))) static uintptr_t next_mem_pos_; #endif __attribute__((visibility("hidden"))) uint32_t map32(uint32_t size){ #ifdef X86_64 return mmap(0,size,PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_32BIT, -1, 0); #else return mmap(0,size,PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); #endif #if defined(__LP64__) && !defined(__x86_64__) // MAP_32BIT only available on x86_64. void* actual = MAP_FAILED; std::string strerr; if (low_4gb && expected == nullptr) { flags |= MAP_FIXED; for (uintptr_t ptr = next_mem_pos; ptr < 4 * GB; ptr += kPageSize) { uintptr_t tail_ptr; // Check pages are free. bool safe = true; for (tail_ptr = ptr; tail_ptr < ptr + page_aligned_byte_count; tail_ptr += kPageSize) { if (msync(reinterpret_cast<void*>(tail_ptr), kPageSize, 0) == 0) { safe = false; break; } else { DCHECK_EQ(errno, ENOMEM); } } next_mem_pos_ = tail_ptr; // update early, as we break out when we found and mapped a region if (safe == true) { actual = mmap(reinterpret_cast<void*>(ptr), page_aligned_byte_count, prot, flags, fd.get(), 0); if (actual != MAP_FAILED) { break; } } else { // Skip over last page. ptr = tail_ptr; } } if (actual == MAP_FAILED) { strerr = "Could not find contiguous low-memory space."; } } else { actual = mmap(expected, page_aligned_byte_count, prot, flags, fd.get(), 0); strerr = strerror(errno); } return actual; #endif }; Loading