@@ -78,22 +78,31 @@ impl Iterator for Env {
78
78
type Item = ( OsString , OsString ) ;
79
79
80
80
fn next ( & mut self ) -> Option < ( OsString , OsString ) > {
81
- unsafe {
82
- if * self . cur == 0 { return None }
83
- let p = & * self . cur ;
84
- let mut len = 0 ;
85
- while * ( p as * const u16 ) . offset ( len) != 0 {
86
- len += 1 ;
81
+ loop {
82
+ unsafe {
83
+ if * self . cur == 0 { return None }
84
+ let p = & * self . cur as * const u16 ;
85
+ let mut len = 0 ;
86
+ while * p. offset ( len) != 0 {
87
+ len += 1 ;
88
+ }
89
+ let s = slice:: from_raw_parts ( p, len as usize ) ;
90
+ self . cur = self . cur . offset ( len + 1 ) ;
91
+
92
+ // Windows allows environment variables to start with an equals
93
+ // symbol (in any other position, this is the separator between
94
+ // variable name and value). Since`s` has at least length 1 at
95
+ // this point (because the empty string terminates the array of
96
+ // environment variables), we can safely slice.
97
+ let pos = match s[ 1 ..] . iter ( ) . position ( |& u| u == b'=' as u16 ) . map ( |p| p + 1 ) {
98
+ Some ( p) => p,
99
+ None => continue ,
100
+ } ;
101
+ return Some ( (
102
+ OsStringExt :: from_wide ( & s[ ..pos] ) ,
103
+ OsStringExt :: from_wide ( & s[ pos+1 ..] ) ,
104
+ ) )
87
105
}
88
- let p = p as * const u16 ;
89
- let s = slice:: from_raw_parts ( p, len as usize ) ;
90
- self . cur = self . cur . offset ( len + 1 ) ;
91
-
92
- let ( k, v) = match s. iter ( ) . position ( |& b| b == '=' as u16 ) {
93
- Some ( n) => ( & s[ ..n] , & s[ n+1 ..] ) ,
94
- None => ( s, & [ ] [ ..] ) ,
95
- } ;
96
- Some ( ( OsStringExt :: from_wide ( k) , OsStringExt :: from_wide ( v) ) )
97
106
}
98
107
}
99
108
}
0 commit comments