bytearray(uctypes.bytes_at(0, 8)) segfaults in memcpy
Port, board and/or hardware
Unix port
MicroPython version
MicroPython v1.27.0-preview.107.gd1607598f on 2025-09-09; linux [GCC 14.2.0] version
Reproduction
import uctypes
arr = uctypes.bytes_at(0, 8)
arr2 = bytearray(arr)
arr2[0] = 1
Expected behaviour
A Python-level exception when the source buffer refers to an unreadable address (e.g., ValueError or OSError), or the unix port rejects bytes_at(0, 8) up front.
Observed behaviour
Program received signal SIGSEGV, Segmentation fault.
[#0] 0x7ffff7d95780 → __memcpy_avx_unaligned_erms()
[#1] 0x5555555fa3fd → memcpy(__dest=<optimised out>, __src=<optimised out>, __len=0x8)
[#2] 0x5555555fa3fd → array_construct(typecode=0x1, initializer=<optimised out>)
[#3] 0x5555555fa73b → bytearray_make_new(type_in=<optimised out>, n_args=0x1, n_kw=<optimised out>, args=0x7ffff7e27de0)
[#4] 0x555555618eff → type_call(self_in=<optimised out>, n_args=<optimised out>, n_kw=<optimised out>, args=<optimised out>)
[#5] 0x5555555ed738 → mp_call_function_n_kw(fun_in=0x55555571d070 <mp_type_bytearray>, n_args=0x1, n_kw=0x0, args=0x7ffff7e27de0)
[#6] 0x555555629936 → mp_execute_bytecode(code_state=0x7ffff7e27da0, inject_exc=<optimised out>)
[#7] 0x555555602482 → fun_bc_call(self_in=0x7ffff7e27ce0, n_args=<optimised out>, n_kw=<optimised out>, args=0x0)
[#8] 0x5555555ed738 → mp_call_function_n_kw(fun_in=0x7ffff7e27ce0, n_args=0x0, n_kw=0x0, args=0x0)
[#9] 0x5555555f0211 → mp_call_function_0(fun=<optimised out>)
Additional Information
No, I've provided everything above.
Code of Conduct
Yes, I agree
uctypes.bytearray_at() accepts negative address and segfaults on write
Port, board and/or hardware
Unix port
MicroPython version
MicroPython v1.27.0-preview.107.gd1607598f on 2025-09-09; linux [GCC 14.2.0] version
Reproduction
try:
import uctypes
except ImportError:
print("SKIP missing uctypes")
else:
try:
ba = uctypes.bytearray_at(-9223372036854775808, 4) # -2**63
ba[0] = 1 # write to the mapped memory
print('should not reach here')
except Exception as e:
print("EXC %s" % type(e).__name__)
Expected behaviour
A Python-level exception instead of process crash, e.g.:
-
ValueError/OverflowError for negative address; or
-
OSError if the address is not accessible.
At minimum, uctypes.bytearray_at() should reject negative addresses on 64-bit builds rather than silently converting them to huge unsigned pointers.
Observed behaviour
Program received signal SIGSEGV, Segmentation fault.
#0 mp_binary_set_val_array_from_int(typecode=0x1, p=0x8000000000000000, index=0x0, val=0x1)
#1 mp_binary_set_val_array(...)
#2 array_subscr(...)
#3 mp_obj_subscr(...)
#4 mp_execute_bytecode(...)
Additional Information
No, I've provided everything above.
Code of Conduct
Yes, I agree