Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions cle/memory.py
Original file line number Diff line number Diff line change
Expand Up @@ -768,6 +768,9 @@ def load(self, addr: int, n: int) -> bytes:
def store(self, addr, data):
raise NotImplementedError("ClemoryReadOnlyView does not support storing")

def pack(self, addr: int, fmt: str, *data):
raise NotImplementedError("ClemoryReadOnlyView does not support packing")

def backers(self, addr: int = 0):
start_pos = bisect.bisect_right(self._flattened_backers, addr, key=lambda x: x[0])
if start_pos > 0:
Expand Down
27 changes: 27 additions & 0 deletions tests/test_clemory.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from __future__ import annotations

import os
import sys
import timeit
import unittest
Expand All @@ -8,6 +9,8 @@

import cle

TEST_BASE = os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "..", "binaries", "tests")


@unittest.skipIf(sys.platform == "emscripten", "runtime CFFI compilation is unavailable in Pyodide")
def test_cclemory(): # pylint: disable=no-member
Expand Down Expand Up @@ -118,6 +121,30 @@ def test_clemory_contains():
assert clemory.consecutive is True


def test_clemory_read_only_view_refuses_writes():
loader = cle.Loader(os.path.join(TEST_BASE, "x86_64", "fauxware"), auto_load_libs=False)
loader.gen_ro_memview()
view = loader.memory_ro_view
assert view is not None

entry = loader.main_object.entry
before = loader.memory.load(entry, 16)
nops = b"\x90" * 8

for write in (
lambda: view.store(entry, nops),
lambda: view.pack(entry, "8s", nops),
lambda: view.pack_word(entry, int.from_bytes(nops, "little")),
):
refused = False
try:
write()
except NotImplementedError:
refused = True
assert refused
assert loader.memory.load(entry, 16) == before


def main():
g = globals()
for func_name, func in g.items():
Expand Down
Loading