comparison src/libpam/environ.rs @ 143:ebb71a412b58

Turn everything into OsString and Just Walk Out! for strings with nul. To reduce the hazard surface of the API, this replaces most uses of &str with &OsStr (and likewise with String/OsString). Also, I've decided that instead of dealing with callers putting `\0` in their parameters, I'm going to follow the example of std::env and Just Walk Out! (i.e., panic!()). This makes things a lot less annoying for both me and (hopefully) users.
author Paul Fisher <paul@pfish.zone>
date Sat, 05 Jul 2025 22:12:46 -0400
parents a508a69c068a
children 56b559b7ecea
comparison
equal deleted inserted replaced
142:5c1e315c18ff 143:ebb71a412b58
197 } 197 }
198 198
199 #[test] 199 #[test]
200 fn test_split_kv() { 200 fn test_split_kv() {
201 fn test(input: &str, key: &str, value: &str) { 201 fn test(input: &str, key: &str, value: &str) {
202 let data = CHeapString::new(input).unwrap(); 202 let data = CHeapString::new(input);
203 let key = os(key); 203 let key = os(key);
204 let value = os(value); 204 let value = os(value);
205 205
206 assert_eq!(EnvVar(data).as_kv(), (key, value)); 206 assert_eq!(EnvVar(data).as_kv(), (key, value));
207 } 207 }
214 214
215 fn env_list(strings: &[&'static str]) -> EnvList<'static> { 215 fn env_list(strings: &[&'static str]) -> EnvList<'static> {
216 let ptrs: NonNull<Option<CHeapString>> = memory::calloc(strings.len() + 1); 216 let ptrs: NonNull<Option<CHeapString>> = memory::calloc(strings.len() + 1);
217 unsafe { 217 unsafe {
218 for (idx, &text) in strings.iter().enumerate() { 218 for (idx, &text) in strings.iter().enumerate() {
219 ptr::write( 219 ptr::write(ptrs.as_ptr().add(idx), Some(CHeapString::new(text)))
220 ptrs.as_ptr().add(idx),
221 Some(CHeapString::new(text).unwrap()),
222 )
223 } 220 }
224 ptr::write(ptrs.as_ptr().add(strings.len()), None); 221 ptr::write(ptrs.as_ptr().add(strings.len()), None);
225 EnvList::from_ptr(ptrs.cast()) 222 EnvList::from_ptr(ptrs.cast())
226 } 223 }
227 } 224 }