Mercurial > crates > nonstick
diff src/libpam/conversation.rs @ 101:94b51fa4f797
Fix memory soundness issues:
- Ensure Questions are pinned in memory when sending them through PAM.
- Hold on to the PAM conversation struct after we build it.
(Linux-PAM is leninent about this and copies the pam_conv structure.)
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Tue, 24 Jun 2025 17:54:33 -0400 |
parents | 3f11b8d30f63 |
children |
line wrap: on
line diff
--- a/src/libpam/conversation.rs Tue Jun 24 17:08:01 2025 -0400 +++ b/src/libpam/conversation.rs Tue Jun 24 17:54:33 2025 -0400 @@ -2,7 +2,7 @@ use crate::conv::{Conversation, ErrorMsg, InfoMsg, MaskedQAndA, Message, QAndA}; use crate::libpam::answer::BinaryAnswer; use crate::libpam::answer::{Answer, Answers, TextAnswer}; -use crate::libpam::memory::{CBinaryData, Immovable}; +use crate::libpam::memory::CBinaryData; use crate::libpam::pam_ffi::AppData; pub use crate::libpam::pam_ffi::LibPamConversation; use crate::libpam::question::QuestionsTrait; @@ -21,7 +21,6 @@ callback: Self::wrapper_callback::<C>, appdata: (conv as *const C).cast(), life: PhantomData, - _marker: Immovable(PhantomData), } } @@ -66,13 +65,13 @@ impl Conversation for LibPamConversation<'_> { fn communicate(&self, messages: &[Message]) { let internal = || { - let questions = Questions::new(messages)?; + let questions = Box::pin(Questions::new(messages)?); let mut response_pointer = std::ptr::null_mut(); // SAFETY: We're calling into PAM with valid everything. let result = unsafe { (self.callback)( messages.len() as c_int, - questions.ptr(), + questions.as_ref().ptr(), &mut response_pointer, self.appdata, )