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,
                 )