Skip to content

Commit f11b153

Browse files
Remove the size limit for memory read and write
Eliminate the maximum size restriction for uc_mem_read and uc_mem_write. This change is required to support applications, such as LLVM CFI, that map or unmap memory blocks with sizes equal to or greater than INT_MAX.
1 parent 7b8c63d commit f11b153

File tree

1 file changed

+4
-8
lines changed

1 file changed

+4
-8
lines changed

uc.c

+4-8
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,8 @@ static bool check_mem_area(uc_engine *uc, uint64_t address, size_t size)
565565
return (count == size);
566566
}
567567

568+
#define MAX_RW_LENGTH ((INT_MAX >> (8*sizeof(int)/2)) << (8*sizeof(int)/2))
569+
568570
UNICORN_EXPORT
569571
uc_err uc_mem_read(uc_engine *uc, uint64_t address, void *_bytes, size_t size)
570572
{
@@ -573,10 +575,6 @@ uc_err uc_mem_read(uc_engine *uc, uint64_t address, void *_bytes, size_t size)
573575

574576
UC_INIT(uc);
575577

576-
// qemu cpu_physical_memory_rw() size is an int
577-
if (size > INT_MAX)
578-
return UC_ERR_ARG;
579-
580578
if (uc->mem_redirect) {
581579
address = uc->mem_redirect(address);
582580
}
@@ -590,6 +588,7 @@ uc_err uc_mem_read(uc_engine *uc, uint64_t address, void *_bytes, size_t size)
590588
MemoryRegion *mr = memory_mapping(uc, address);
591589
if (mr) {
592590
len = (size_t)MIN(size - count, mr->end - address);
591+
len = (size_t)MIN(len, MAX_RW_LENGTH);
593592
if (uc->read_mem(&uc->address_space_memory, address, bytes, len) ==
594593
false) {
595594
break;
@@ -618,10 +617,6 @@ uc_err uc_mem_write(uc_engine *uc, uint64_t address, const void *_bytes,
618617

619618
UC_INIT(uc);
620619

621-
// qemu cpu_physical_memory_rw() size is an int
622-
if (size > INT_MAX)
623-
return UC_ERR_ARG;
624-
625620
if (uc->mem_redirect) {
626621
address = uc->mem_redirect(address);
627622
}
@@ -642,6 +637,7 @@ uc_err uc_mem_write(uc_engine *uc, uint64_t address, const void *_bytes,
642637
}
643638

644639
len = (size_t)MIN(size - count, mr->end - address);
640+
len = (size_t)MIN(len, MAX_RW_LENGTH);
645641
if (uc->write_mem(&uc->address_space_memory, address, bytes, len) ==
646642
false) {
647643
break;

0 commit comments

Comments
 (0)