Skip to content

Commit 0f95041

Browse files
authored
Accept buffer exporters for binary registry values (#9607)
Keep exact bytes on the direct path, acquire a simple buffer for other exporters, and snapshot the key before buffer callbacks run. Assisted-by: dot:frontier-intelligence
1 parent 7ac3f1f commit 0f95041

1 file changed

Lines changed: 16 additions & 9 deletions

File tree

‎crates/vm/src/stdlib/winreg.rs‎

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -921,14 +921,21 @@ mod winreg {
921921
if vm.is_none(&value) {
922922
return Ok(None);
923923
}
924-
// Try to get bytes
925-
if let Some(bytes) = value.downcast_ref::<crate::builtins::PyBytes>() {
924+
// Exact bytes need no buffer acquisition; subclasses and other
925+
// exporters must use their buffer protocol implementation.
926+
if value.class().is(vm.ctx.types.bytes_type) {
927+
let bytes = value
928+
.downcast_ref::<crate::builtins::PyBytes>()
929+
.expect("the exact bytes type has a bytes payload");
926930
return Ok(Some(bytes.as_bytes().to_vec()));
927931
}
928-
Err(vm.new_type_error(format!(
929-
"Objects of type '{}' can not be used as binary registry values",
930-
value.class().name()
931-
)))
932+
if !value.check_buffer() {
933+
return Err(vm.new_type_error(format!(
934+
"Objects of type '{}' can not be used as binary registry values",
935+
value.class().name()
936+
)));
937+
}
938+
value.try_bytes_like(vm, |bytes| Some(bytes.to_vec()))
932939
}
933940
}
934941
}
@@ -942,6 +949,7 @@ mod winreg {
942949
value: PyObjectRef,
943950
vm: &VirtualMachine,
944951
) -> PyResult<()> {
952+
let hkey = key.hkey.load();
945953
let value_name = value_name
946954
.map(WideCString::from_str)
947955
.transpose()
@@ -951,9 +959,8 @@ mod winreg {
951959
Some(v) => (v.as_ptr(), v.len() as u32),
952960
None => (core::ptr::null(), 0),
953961
};
954-
let res = unsafe {
955-
host_winreg::set_value_ex(key.hkey.load(), value_name.as_deref(), r#type, ptr, len)
956-
};
962+
let res =
963+
unsafe { host_winreg::set_value_ex(hkey, value_name.as_deref(), r#type, ptr, len) };
957964
if res != 0 {
958965
return Err(os_error_from_windows_code(vm, res as i32));
959966
}

0 commit comments

Comments
 (0)