comparison src/libpam/conversation.rs @ 93:efc2b56c8928

Remove undefined behavior per MIRI. This replaces a bunch of raw pointers with NonNull and removes all the undefined behavior that we can find with MIRI. We also remove the `SecureString` dependency (since it doesn't work with MIRI, and because it's not really necessary).
author Paul Fisher <paul@pfish.zone>
date Mon, 23 Jun 2025 13:02:58 -0400
parents dd3e9c4bcde3
children f3e260f9ddcb
comparison
equal deleted inserted replaced
92:5ddbcada30f2 93:efc2b56c8928
1 use crate::conv::{BinaryQAndA, RadioQAndA}; 1 use crate::conv::{BinaryQAndA, RadioQAndA};
2 use crate::conv::{Conversation, ErrorMsg, InfoMsg, MaskedQAndA, Message, QAndA}; 2 use crate::conv::{Conversation, ErrorMsg, InfoMsg, MaskedQAndA, Message, QAndA};
3 use crate::libpam::answer::BinaryAnswer; 3 use crate::libpam::answer::BinaryAnswer;
4 use crate::libpam::answer::{Answer, Answers, TextAnswer}; 4 use crate::libpam::answer::{Answer, Answers, TextAnswer};
5 use crate::libpam::memory::Immovable; 5 use crate::libpam::memory::{CBinaryData, Immovable};
6 use crate::libpam::pam_ffi::AppData; 6 use crate::libpam::pam_ffi::AppData;
7 pub use crate::libpam::pam_ffi::LibPamConversation; 7 pub use crate::libpam::pam_ffi::LibPamConversation;
8 use crate::libpam::question::QuestionsTrait; 8 use crate::libpam::question::QuestionsTrait;
9 use crate::libpam::question::{Question, Questions}; 9 use crate::libpam::question::{Question, Questions};
10 use crate::ErrorCode; 10 use crate::ErrorCode;
137 Message::Error(m) => m.set_answer(Ok(())), 137 Message::Error(m) => m.set_answer(Ok(())),
138 Message::Info(m) => m.set_answer(Ok(())), 138 Message::Info(m) => m.set_answer(Ok(())),
139 Message::RadioPrompt(qa) => fill_text!(qa, resp), 139 Message::RadioPrompt(qa) => fill_text!(qa, resp),
140 Message::BinaryPrompt(qa) => { 140 Message::BinaryPrompt(qa) => {
141 let bin_resp = unsafe { BinaryAnswer::upcast(resp) }; 141 let bin_resp = unsafe { BinaryAnswer::upcast(resp) };
142 qa.set_answer(Ok(bin_resp.data().into())); 142 qa.set_answer(Ok(bin_resp
143 .data()
144 .map(|d| unsafe { CBinaryData::as_binary_data(d) })
145 .unwrap_or_default()));
143 bin_resp.zero_contents() 146 bin_resp.zero_contents()
144 } 147 }
145 } 148 }
146 } 149 }