comparison src/libpam/conversation.rs @ 139:33b9622ed6d2

Remove redundant memory management in nonstick::libpam; fix UB. - Uses the libpam-sys-helpers BinaryPayload / OwnedBinaryPayload structs to handle memory management and parsing for Linux-PAM binary messages. - Gets rid of the (technically) undefined behavior in PtrPtrVec due to pointer provenance. - Don't check for malloc failing. It won't, even if it does. - Formatting/cleanups/etc.
author Paul Fisher <paul@pfish.zone>
date Thu, 03 Jul 2025 23:57:49 -0400
parents efbc235f01d3
children a508a69c068a
comparison
equal deleted inserted replaced
138:999bf07efbcb 139:33b9622ed6d2
1 use crate::conv::{BinaryQAndA, RadioQAndA}; 1 use crate::conv::{BinaryQAndA, RadioQAndA};
2 use crate::conv::{Conversation, ErrorMsg, Exchange, InfoMsg, MaskedQAndA, QAndA}; 2 use crate::conv::{Conversation, ErrorMsg, Exchange, InfoMsg, MaskedQAndA, 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::CBinaryData;
6 use crate::libpam::question::Question; 5 use crate::libpam::question::Question;
7 use crate::ErrorCode; 6 use crate::ErrorCode;
8 use crate::Result; 7 use crate::Result;
8 use libpam_sys::AppData;
9 use libpam_sys_helpers::memory::PtrPtrVec; 9 use libpam_sys_helpers::memory::PtrPtrVec;
10 use libpam_sys::AppData;
11 use std::ffi::c_int; 10 use std::ffi::c_int;
12 use std::iter; 11 use std::iter;
13 use std::marker::PhantomData; 12 use std::marker::PhantomData;
14 use std::ptr::NonNull; 13 use std::ptr::NonNull;
15 use std::result::Result as StdResult; 14 use std::result::Result as StdResult;
151 Exchange::Info(m) => m.set_answer(Ok(())), 150 Exchange::Info(m) => m.set_answer(Ok(())),
152 Exchange::RadioPrompt(qa) => fill_text!(qa, resp), 151 Exchange::RadioPrompt(qa) => fill_text!(qa, resp),
153 Exchange::BinaryPrompt(qa) => { 152 Exchange::BinaryPrompt(qa) => {
154 let bin_resp = unsafe { BinaryAnswer::upcast(resp) }; 153 let bin_resp = unsafe { BinaryAnswer::upcast(resp) };
155 qa.set_answer(Ok(bin_resp 154 qa.set_answer(Ok(bin_resp
156 .data() 155 .contents()
157 .map(|d| unsafe { CBinaryData::as_binary_data(d) }) 156 .map(|d| d.into())
158 .unwrap_or_default())); 157 .unwrap_or_default()));
159 bin_resp.zero_contents() 158 bin_resp.zero_contents()
160 } 159 }
161 } 160 }
162 } 161 }