Author: Edd Barrett <vex...@gmail.com> Branch: w-xor-x Changeset: r86197:e32e8a566374 Date: 2016-08-15 14:51 +0100 http://bitbucket.org/pypy/pypy/changeset/e32e8a566374/
Log: Only allocate writable pages, and supply functions to change protection mask. diff --git a/rpython/rlib/rmmap.py b/rpython/rlib/rmmap.py --- a/rpython/rlib/rmmap.py +++ b/rpython/rlib/rmmap.py @@ -155,6 +155,8 @@ c_mmap, c_mmap_safe = external('mmap', [PTR, size_t, rffi.INT, rffi.INT, rffi.INT, off_t], PTR, macro=True, save_err_on_unsafe=rffi.RFFI_SAVE_ERRNO) + c_mprotect, _ = external('mprotect', + [PTR, size_t, rffi.INT], rffi.INT) # 'mmap' on linux32 is a macro that calls 'mmap64' _, c_munmap_safe = external('munmap', [PTR, size_t], rffi.INT) c_msync, _ = external('msync', [PTR, size_t, rffi.INT], rffi.INT, @@ -707,12 +709,22 @@ def alloc_hinted(hintp, map_size): flags = MAP_PRIVATE | MAP_ANONYMOUS - prot = PROT_EXEC | PROT_READ | PROT_WRITE + prot = PROT_READ | PROT_WRITE if we_are_translated(): flags = NonConstant(flags) prot = NonConstant(prot) return c_mmap_safe(hintp, map_size, prot, flags, -1, 0) + def set_pages_executable(addr, size): + rv = c_mprotect(addr, size, PROT_EXEC | PROT_READ) + if rv < 0: + debug.fatalerror_notb("set_pages_executable failed") + + def set_pages_writable(addr, size): + rv = c_mprotect(addr, size, PROT_WRITE | PROT_READ) + if rv < 0: + debug.fatalerror_notb("set_pages_executable failed") + def clear_large_memory_chunk_aligned(addr, map_size): addr = rffi.cast(PTR, addr) flags = MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS @@ -951,6 +963,9 @@ return res alloc._annenforceargs_ = (int,) + def set_pages_executable(addr, size): + pass # XXX not implemented on windows + def free(ptr, map_size): VirtualFree_safe(ptr, 0, MEM_RELEASE) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit