diff src/libpam/conversation.rs @ 89:dd3e9c4bcde3

Simplify memory management in Questions. When we're sending Questions to the client, we don't need them to be C-managed, we just need the pointers going to the right place. This replaces a bunch of Question management cruft with Vecs and Boxes.
author Paul Fisher <paul@pfish.zone>
date Fri, 13 Jun 2025 05:22:48 -0400
parents 05291b601f0a
children efc2b56c8928
line wrap: on
line diff
--- a/src/libpam/conversation.rs	Tue Jun 10 05:36:58 2025 -0400
+++ b/src/libpam/conversation.rs	Fri Jun 13 05:22:48 2025 -0400
@@ -5,7 +5,8 @@
 use crate::libpam::memory::Immovable;
 use crate::libpam::pam_ffi::AppData;
 pub use crate::libpam::pam_ffi::LibPamConversation;
-use crate::libpam::question::{Indirect, IndirectTrait, Question, Questions};
+use crate::libpam::question::QuestionsTrait;
+use crate::libpam::question::{Question, Questions};
 use crate::ErrorCode;
 use crate::Result;
 use std::ffi::c_int;
@@ -38,12 +39,11 @@
                 .cast::<C>()
                 .as_mut()
                 .ok_or(ErrorCode::ConversationError)?;
-            let indirect = Indirect::borrow_ptr(questions).ok_or(ErrorCode::ConversationError)?;
+            let indirect = Questions::borrow_ptr(questions, count as usize);
             let answers_ptr = answers.as_mut().ok_or(ErrorCode::ConversationError)?;
 
             // Build our owned list of Q&As from the questions we've been asked
             let messages: Vec<OwnedMessage> = indirect
-                .iter(count as usize)
                 .map(TryInto::try_into)
                 .collect::<Result<_>>()
                 .map_err(|_| ErrorCode::ConversationError)?;
@@ -71,7 +71,7 @@
             let result = unsafe {
                 (self.callback)(
                     messages.len() as c_int,
-                    questions.indirect(),
+                    questions.ptr(),
                     &mut response_pointer,
                     self.appdata,
                 )