comparison libpam-sys/libpam-sys-helpers/src/memory.rs @ 140:add7228adb2f

Neaten up some stuff in libpam-sys memory module.
author Paul Fisher <paul@pfish.zone>
date Sat, 05 Jul 2025 17:11:33 -0400
parents 33b9622ed6d2
children ebb71a412b58
comparison
equal deleted inserted replaced
139:33b9622ed6d2 140:add7228adb2f
197 #[cfg(not(pam_impl = "LinuxPam"))] 197 #[cfg(not(pam_impl = "LinuxPam"))]
198 return Self::iter_over_xsso(ptr_ptr, count); 198 return Self::iter_over_xsso(ptr_ptr, count);
199 } 199 }
200 200
201 fn assert_size<That>() { 201 fn assert_size<That>() {
202 debug_assert_eq!( 202 assert_eq!(
203 mem::size_of::<T>(), 203 mem::size_of::<T>(),
204 mem::size_of::<That>(), 204 mem::size_of::<That>(),
205 "type {t} is not the size of {that}", 205 "type {t} is not the size of {that}",
206 t = any::type_name::<T>(), 206 t = any::type_name::<T>(),
207 that = any::type_name::<That>(), 207 that = any::type_name::<That>(),
237 /// This is intended to allow you to bring your own allocator for 237 /// This is intended to allow you to bring your own allocator for
238 /// [`OwnedBinaryPayload`]s. 238 /// [`OwnedBinaryPayload`]s.
239 /// 239 ///
240 /// For an implementation example, see the implementation of this trait 240 /// For an implementation example, see the implementation of this trait
241 /// for [`Vec`]. 241 /// for [`Vec`].
242 #[allow(clippy::wrong_self_convention)]
242 pub trait Buffer { 243 pub trait Buffer {
243 /// Allocates a buffer of `len` elements, filled with the default. 244 /// Allocates a buffer of `len` elements, filled with the default.
244 fn allocate(len: usize) -> Self; 245 fn allocate(len: usize) -> Self;
245 246
246 fn as_ptr(this: &Self) -> *const u8; 247 fn as_ptr(this: &Self) -> *const u8;
303 304
304 /// The structure of the "binary message" payload for the `PAM_BINARY_PROMPT` 305 /// The structure of the "binary message" payload for the `PAM_BINARY_PROMPT`
305 /// extension from Linux-PAM. 306 /// extension from Linux-PAM.
306 pub struct BinaryPayload { 307 pub struct BinaryPayload {
307 /// The total byte size of the message, including this header, 308 /// The total byte size of the message, including this header,
308 /// as a u32 in network byte order (big endian). 309 /// as u32 in network byte order (big endian).
309 pub total_bytes_u32be: [u8; 4], 310 pub total_bytes_u32be: [u8; 4],
310 /// A tag used to provide some kind of hint as to what the data is. 311 /// A tag used to provide some kind of hint as to what the data is.
311 /// Its meaning is undefined. 312 /// Its meaning is undefined.
312 pub data_type: u8, 313 pub data_type: u8,
313 /// Where the data itself would start, used as a marker to make this 314 /// Where the data itself would start, used as a marker to make this
512 let msg = PtrPtrVec::new(bad_vec); 513 let msg = PtrPtrVec::new(bad_vec);
513 let _ = msg.as_ptr::<u64>(); 514 let _ = msg.as_ptr::<u64>();
514 } 515 }
515 516
516 #[allow(deprecated)] 517 #[allow(deprecated)]
517 #[cfg(debug_assertions)]
518 #[test] 518 #[test]
519 #[should_panic] 519 #[should_panic]
520 fn test_iter_xsso_wrong_size() { 520 fn test_iter_xsso_wrong_size() {
521 unsafe { 521 unsafe {
522 let _ = PtrPtrVec::<u8>::iter_over_xsso::<f64>(ptr::null(), 1); 522 let _ = PtrPtrVec::<u8>::iter_over_xsso::<f64>(ptr::null(), 1);
523 } 523 }
524 } 524 }
525 525
526 #[allow(deprecated)] 526 #[allow(deprecated)]
527 #[cfg(debug_assertions)]
528 #[test] 527 #[test]
529 #[should_panic] 528 #[should_panic]
530 fn test_iter_linux_wrong_size() { 529 fn test_iter_linux_wrong_size() {
531 unsafe { 530 unsafe {
532 let _ = PtrPtrVec::<u128>::iter_over_linux::<()>(ptr::null(), 1); 531 let _ = PtrPtrVec::<u128>::iter_over_linux::<()>(ptr::null(), 1);
554 } 553 }
555 554
556 #[allow(deprecated)] 555 #[allow(deprecated)]
557 #[test] 556 #[test]
558 fn test_iter_ptr_ptr() { 557 fn test_iter_ptr_ptr() {
559 let strs = vec![Box::new("a"), Box::new("b"), Box::new("c"), Box::new("D")]; 558 // These boxes are larger than a single pointer because we want to
560 let ptr: *const *const &str = strs.as_ptr().cast(); 559 // make sure they're not accidentally allocated adjacently
560 // in such a way that it's compatible with X/SSO.
561 //
562 // a pointer to (&str, i32) can be treated as a pointer to (&str).
563 #[repr(C)]
564 struct pair(&'static str, i32);
565 let boxes = vec![
566 Box::new(pair("a", 1)),
567 Box::new(pair("b", 2)),
568 Box::new(pair("c", 3)),
569 Box::new(pair("D", 4)),
570 ];
571 let ptr: *const *const &str = boxes.as_ptr().cast();
561 let got: Vec<&str> = unsafe { PtrPtrVec::iter_over_linux(ptr, 4) } 572 let got: Vec<&str> = unsafe { PtrPtrVec::iter_over_linux(ptr, 4) }
562 .cloned() 573 .cloned()
563 .collect(); 574 .collect();
564 assert_eq!(vec!["a", "b", "c", "D"], got); 575 assert_eq!(vec!["a", "b", "c", "D"], got);
565 576
577 // On the other hand, we explicitly want these to be adjacent.
566 let nums = [-1i8, 2, 3]; 578 let nums = [-1i8, 2, 3];
567 let ptr = nums.as_ptr(); 579 let ptr = nums.as_ptr();
568 let got: Vec<u8> = unsafe { PtrPtrVec::iter_over_xsso(&ptr, 3) } 580 let got: Vec<u8> = unsafe { PtrPtrVec::iter_over_xsso(&ptr, 3) }
569 .cloned() 581 .cloned()
570 .collect(); 582 .collect();