Chromium Code Reviews| Index: components/nacl/loader/nonsfi/irt_memory.cc |
| diff --git a/components/nacl/loader/nonsfi/irt_memory.cc b/components/nacl/loader/nonsfi/irt_memory.cc |
| index cd7796515db0890b284c218fd4c89d6a0881ff50..16f38e69d030a03c1edaa8d5b619c10b0f0e513e 100644 |
| --- a/components/nacl/loader/nonsfi/irt_memory.cc |
| +++ b/components/nacl/loader/nonsfi/irt_memory.cc |
| @@ -5,6 +5,7 @@ |
| #include <errno.h> |
| #include <sys/mman.h> |
| +#include "base/logging.h" |
| #include "components/nacl/loader/nonsfi/irt_interfaces.h" |
| #include "components/nacl/loader/nonsfi/irt_util.h" |
| #include "native_client/src/trusted/service_runtime/include/machine/_types.h" |
| @@ -46,10 +47,21 @@ int NaClFlagsToFlags(int nacl_flags) { |
| int IrtMMap(void** addr, size_t len, int prot, int flags, |
| int fd, nacl_abi_off_t off) { |
| - void* result = |
| - mmap(*addr, len, NaClProtToProt(prot), NaClFlagsToFlags(flags), fd, off); |
| + const int host_prot = NaClProtToProt(prot); |
| + // On Chrome OS, mmap will fail if PROT_EXEC is set in |host_prot|, |
|
Mark Seaborn
2014/04/15 23:28:03
Nit: "can fail"
mazda
2014/04/16 00:33:36
Done.
|
| + // but mprotect will allow changing the permissions later. |
| + // See the comments for NaClHostDescMap in |
|
Mark Seaborn
2014/04/15 23:28:03
X-refs in comments are a little bit of an anti-pat
mazda
2014/04/16 00:33:36
Done.
|
| + // native_client/src/shared/platform/posix/nacl_host_desc.c for details. |
| + void* result = mmap( |
| + *addr, len, host_prot & ~PROT_EXEC, NaClFlagsToFlags(flags), fd, off); |
| if (result == MAP_FAILED) |
| return errno; |
| + if (host_prot & PROT_EXEC) { |
| + if (mprotect(result, len, host_prot) != 0) { |
| + LOG(FATAL) << "IrtMMap: mprotect to turn on PROT_EXEC failed, " |
|
Mark Seaborn
2014/04/15 23:28:03
I was going to suggest doing "return errno" here,
mazda
2014/04/16 00:33:36
Done.
|
| + << "errno " << errno; |
|
Mark Seaborn
2014/04/15 23:28:03
It's better to use LOG_ERRNO or PLOG -- they repor
mazda
2014/04/16 00:33:36
Done.
|
| + } |
| + } |
| *addr = result; |
| return 0; |