diff --git a/qemu/exec.c b/qemu/exec.c index 35e8a1ed..fcb2b7f4 100644 --- a/qemu/exec.c +++ b/qemu/exec.c @@ -1083,6 +1083,7 @@ static ram_addr_t ram_block_add(struct uc_struct *uc, RAMBlock *new_block, Error return new_block->offset; } +// return -1 on error ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, MemoryRegion *mr, Error **errp) { @@ -1092,6 +1093,9 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, size = TARGET_PAGE_ALIGN(size); new_block = g_malloc0(sizeof(*new_block)); + if (new_block == NULL) + return -1; + new_block->mr = mr; new_block->length = size; new_block->fd = -1; diff --git a/qemu/memory.c b/qemu/memory.c index f5067a30..eaab3ba6 100644 --- a/qemu/memory.c +++ b/qemu/memory.c @@ -36,6 +36,9 @@ MemoryRegion *memory_map(struct uc_struct *uc, ram_addr_t begin, size_t size, ui MemoryRegion *ram = g_new(MemoryRegion, 1); memory_region_init_ram(uc, ram, NULL, "pc.ram", size, perms, &error_abort); + if (ram->ram_addr == -1) + // out of memory + return NULL; memory_region_add_subregion(get_system_memory(uc), begin, ram); diff --git a/qemu/util/error.c b/qemu/util/error.c index d7bedde7..9c49facb 100644 --- a/qemu/util/error.c +++ b/qemu/util/error.c @@ -40,7 +40,7 @@ void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...) err->err_class = err_class; if (errp == &error_abort) { - abort(); + // abort(); } *errp = err; @@ -75,7 +75,7 @@ void error_set_errno(Error **errp, int os_errno, ErrorClass err_class, err->err_class = err_class; if (errp == &error_abort) { - abort(); + // abort(); } *errp = err; @@ -160,7 +160,7 @@ void error_free(Error *err) void error_propagate(Error **dst_errp, Error *local_err) { if (local_err && dst_errp == &error_abort) { - abort(); + // abort(); } else if (dst_errp && !*dst_errp) { *dst_errp = local_err; } else if (local_err) { diff --git a/tests/regress/init.py b/tests/regress/init.py old mode 100644 new mode 100755 diff --git a/uc.c b/uc.c index e3107b70..cf9e7026 100644 --- a/uc.c +++ b/uc.c @@ -593,7 +593,11 @@ uc_err uc_mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms) } uc->mapped_blocks = regions; } + uc->mapped_blocks[uc->mapped_block_count] = uc->memory_map(uc, address, size, perms); + if (uc->mapped_blocks[uc->mapped_block_count] == NULL) + return UC_ERR_NOMEM; + uc->mapped_block_count++; return UC_ERR_OK;