Skip to content

Commit d259bc0

Browse files
committed
Bound blob overflow type names to the C API diagnostic contract
Use the stored tp_name equivalent and preserve UTF-8 boundaries at the 200-byte diagnostic limit. Assisted-by: OpenAI Codex:model identifier unavailable
1 parent 00aa46b commit d259bc0

2 files changed

Lines changed: 15 additions & 1 deletion

File tree

‎crates/stdlib/src/_sqlite3.rs‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2722,9 +2722,15 @@ mod _sqlite3 {
27222722
vm: &VirtualMachine,
27232723
) -> PyResult<c_int> {
27242724
let mut index = index.try_to_primitive::<isize>(vm).map_err(|_| {
2725+
let class = object.class();
2726+
let type_name = class.slot_name();
2727+
let mut end = type_name.len().min(200);
2728+
while !type_name.is_char_boundary(end) {
2729+
end -= 1;
2730+
}
27252731
vm.new_index_error(format!(
27262732
"cannot fit '{}' into an index-sized integer",
2727-
object.class().name()
2733+
&type_name[..end]
27282734
))
27292735
})?;
27302736
if index < 0 {

‎extra_tests/snippets/stdlib_sqlite.py‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,14 @@ def __index__(self):
113113
with test.assertRaisesRegex(IndexError, message):
114114
blob[index] = 0
115115

116+
for name, bounded_name in (("X" * 250, "X" * 200), ("€" * 67, "€" * 66)):
117+
long_index = type(name, (), {"__index__": lambda self: sys.maxsize + 1})()
118+
message = f"^cannot fit '{bounded_name}' into an index-sized integer$"
119+
with test.assertRaisesRegex(IndexError, message):
120+
blob[long_index]
121+
with test.assertRaisesRegex(IndexError, message):
122+
blob[long_index] = 0
123+
116124
with test.assertRaisesRegex(OverflowError, "^index conversion failed$"):
117125
blob[BrokenBlobIndex()]
118126
with test.assertRaisesRegex(OverflowError, "^index conversion failed$"):

0 commit comments

Comments
 (0)