22
33use super :: os:: errno_err;
44use crate :: {
5- builtins:: { dict :: PyMapping , PyDictRef , PyStrRef } ,
5+ builtins:: { PyListRef , PyStrRef } ,
66 exceptions:: IntoPyException ,
77 function:: OptionalArg ,
8- PyObjectRef , PyResult , PySequence , TryFromObject , VirtualMachine ,
8+ protocol:: PyMapping ,
9+ ItemProtocol , PyObjectRef , PyResult , PySequence , TryFromObject , VirtualMachine ,
910} ;
1011use std:: ptr:: { null, null_mut} ;
1112use winapi:: shared:: winerror;
@@ -155,7 +156,7 @@ fn _winapi_CreateProcess(
155156
156157 let mut env = args
157158 . env_mapping
158- . map ( |m| getenvironment ( m. into_dict ( ) , vm) )
159+ . map ( |m| getenvironment ( m, vm) )
159160 . transpose ( ) ?;
160161 let env = env. as_mut ( ) . map_or_else ( null_mut, |v| v. as_mut_ptr ( ) ) ;
161162
@@ -216,9 +217,21 @@ fn _winapi_CreateProcess(
216217 ) )
217218}
218219
219- fn getenvironment ( env : PyDictRef , vm : & VirtualMachine ) -> PyResult < Vec < u16 > > {
220+ fn getenvironment ( env : PyMapping , vm : & VirtualMachine ) -> PyResult < Vec < u16 > > {
221+ let keys = env. keys ( vm) ?;
222+ let values = env. values ( vm) ?;
223+
224+ let keys = PyListRef :: try_from_object ( vm, keys) ?. borrow_vec ( ) . to_vec ( ) ;
225+ let values = PyListRef :: try_from_object ( vm, values) ?
226+ . borrow_vec ( )
227+ . to_vec ( ) ;
228+
229+ if keys. len ( ) != values. len ( ) {
230+ return Err ( vm. new_runtime_error ( "environment changed size during iteration" . to_owned ( ) ) ) ;
231+ }
232+
220233 let mut out = widestring:: WideString :: new ( ) ;
221- for ( k, v) in env {
234+ for ( k, v) in keys . into_iter ( ) . zip ( values . into_iter ( ) ) {
222235 let k = PyStrRef :: try_from_object ( vm, k) ?;
223236 let k = k. as_str ( ) ;
224237 let v = PyStrRef :: try_from_object ( vm, v) ?;
@@ -252,10 +265,11 @@ impl Drop for AttrList {
252265
253266fn getattributelist ( obj : PyObjectRef , vm : & VirtualMachine ) -> PyResult < Option < AttrList > > {
254267 <Option < PyMapping > >:: try_from_object ( vm, obj) ?
255- . map ( |d| {
256- let d = d. into_dict ( ) ;
257- let handlelist = d
258- . get_item_option ( "handle_list" , vm) ?
268+ . map ( |mapping| {
269+ let handlelist = mapping
270+ . into_object ( )
271+ . get_item ( "handle_list" , vm)
272+ . ok ( )
259273 . and_then ( |obj| {
260274 <Option < PySequence < usize > > >:: try_from_object ( vm, obj)
261275 . map ( |s| match s {
@@ -265,6 +279,7 @@ fn getattributelist(obj: PyObjectRef, vm: &VirtualMachine) -> PyResult<Option<At
265279 . transpose ( )
266280 } )
267281 . transpose ( ) ?;
282+
268283 let attr_count = handlelist. is_some ( ) as u32 ;
269284 let mut size = 0 ;
270285 let ret = unsafe {
0 commit comments