From f4b23d4444ceeb0301eb85eb95afa5de8c9632cd Mon Sep 17 00:00:00 2001 From: Kevin Phoenix Date: Tue, 4 Aug 2026 10:11:26 -0700 Subject: [PATCH] UltraPage: Write to concrete_data as a single block instead of loop (#6760) --- .../memory_mixins/paged_memory/pages/ultra_page.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/angr/storage/memory_mixins/paged_memory/pages/ultra_page.py b/angr/storage/memory_mixins/paged_memory/pages/ultra_page.py index 5fbcf1b95..fc2342cb3 100644 --- a/angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +++ b/angr/storage/memory_mixins/paged_memory/pages/ultra_page.py @@ -185,17 +185,16 @@ class UltraPage(MemoryObjectMixin, PageBase): self.symbolic_bitmap.clear_range(addr, addr + size) # store - arange = range(addr, addr + size) ival = data if type(data) is int else data.object.args[0] - if endness == "Iend_BE": - arange = reversed(arange) assert memory.state.arch.byte_width == 8 # TODO: Make UltraPage support architectures with greater byte_widths (but are still multiples of 8) concrete_data = self._concrete() - for subaddr in arange: - concrete_data[subaddr] = ival & 0xFF - ival >>= 8 + + # Serialize in one step. + concrete_data[addr : addr + size] = (ival & ((1 << (size * 8)) - 1)).to_bytes( + size, "big" if endness == "Iend_BE" else "little" + ) else: # mark range as symbolic self.symbolic_bitmap.set_range(addr, addr + size)