Mercurial > crates > nonstick
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 } |