From 083cfd0e4a471c4f76d872ce6b521e6443246b3a Mon Sep 17 00:00:00 2001 From: Julia Hansbrough Date: Tue, 26 Feb 2019 23:57:48 -0800 Subject: [PATCH] executor: update syntax for making W+X fuchsia memory Fuchsia recently changed such that zx_vmar_map can't be declared executable and writeable at the same time; use a new syscall for this purpose. Also made a few errors more informative. --- executor/common_fuchsia.h | 6 +++++- executor/executor_fuchsia.h | 5 +++-- pkg/csource/generated.go | 6 +++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/executor/common_fuchsia.h b/executor/common_fuchsia.h index b40120b1..a049bd17 100644 --- a/executor/common_fuchsia.h +++ b/executor/common_fuchsia.h @@ -176,12 +176,16 @@ long syz_mmap(size_t addr, size_t size) fail("zx_object_get_info(ZX_INFO_VMAR) failed: %d", status); zx_handle_t vmo; status = zx_vmo_create(size, 0, &vmo); + if (status != ZX_OK) { + debug("zx_vmo_create failed with: %d", status); + return status; + } + status = zx_vmo_replace_as_executable(vmo, ZX_HANDLE_INVALID, &vmo); if (status != ZX_OK) return status; uintptr_t mapped_addr; status = zx_vmar_map(root, ZX_VM_FLAG_SPECIFIC_OVERWRITE | ZX_VM_FLAG_PERM_READ | ZX_VM_FLAG_PERM_WRITE | ZX_VM_FLAG_PERM_EXECUTE, addr - info.base, vmo, 0, size, - &mapped_addr); return status; } diff --git a/executor/executor_fuchsia.h b/executor/executor_fuchsia.h index ebd4f678..0703a07d 100644 --- a/executor/executor_fuchsia.h +++ b/executor/executor_fuchsia.h @@ -12,8 +12,9 @@ static void os_init(int argc, char** argv, void* data, size_t data_size) { - if (syz_mmap((size_t)data, data_size) != ZX_OK) - fail("mmap of data segment failed"); + zx_status_t status = syz_mmap((size_t)data, data_size); + if (status != ZX_OK) + fail("mmap of data segment failed with: %d", status); } static long execute_syscall(const call_t* c, long a[kMaxArgs]) diff --git a/pkg/csource/generated.go b/pkg/csource/generated.go index 37a03253..497b60da 100644 --- a/pkg/csource/generated.go +++ b/pkg/csource/generated.go @@ -912,12 +912,16 @@ long syz_mmap(size_t addr, size_t size) fail("zx_object_get_info(ZX_INFO_VMAR) failed: %d", status); zx_handle_t vmo; status = zx_vmo_create(size, 0, &vmo); + if (status != ZX_OK) { + debug("zx_vmo_create failed with: %d", status); + return status; + } + status = zx_vmo_replace_as_executable(vmo, ZX_HANDLE_INVALID, &vmo); if (status != ZX_OK) return status; uintptr_t mapped_addr; status = zx_vmar_map(root, ZX_VM_FLAG_SPECIFIC_OVERWRITE | ZX_VM_FLAG_PERM_READ | ZX_VM_FLAG_PERM_WRITE | ZX_VM_FLAG_PERM_EXECUTE, addr - info.base, vmo, 0, size, - &mapped_addr); return status; }