From 1c2ff27e75d6027964993d8e840af1e10caed464 Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Wed, 4 Oct 2023 09:09:44 +0200 Subject: [PATCH] pve: switch openid to use magic Instead of blessed raw pointers as these can easily lead to double free corruptions when they're copied in perl. Signed-off-by: Wolfgang Bumiller --- pve-rs/src/openid/mod.rs | 34 ++++++---------------------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/pve-rs/src/openid/mod.rs b/pve-rs/src/openid/mod.rs index 8572221..1fa7572 100644 --- a/pve-rs/src/openid/mod.rs +++ b/pve-rs/src/openid/mod.rs @@ -1,6 +1,5 @@ #[perlmod::package(name = "PVE::RS::OpenId", lib = "pve_rs")] mod export { - use std::convert::TryFrom; use std::sync::Mutex; use anyhow::Error; @@ -9,34 +8,13 @@ mod export { use proxmox_openid::{OpenIdAuthenticator, OpenIdConfig, PrivateAuthState}; - const CLASSNAME: &str = "PVE::RS::OpenId"; + perlmod::declare_magic!(Box : &OpenId as "PVE::RS::OpenId"); /// An OpenIdAuthenticator client instance. pub struct OpenId { inner: Mutex, } - impl<'a> TryFrom<&'a Value> for &'a OpenId { - type Error = Error; - - fn try_from(value: &'a Value) -> Result<&'a OpenId, Error> { - Ok(unsafe { value.from_blessed_box(CLASSNAME)? }) - } - } - - fn bless(class: Value, mut ptr: Box) -> Result { - let value = Value::new_pointer::(&mut *ptr); - let value = Value::new_ref(&value); - let this = value.bless_sv(&class)?; - let _perl = Box::leak(ptr); - Ok(this) - } - - #[export(name = "DESTROY")] - fn destroy(#[raw] this: Value) { - perlmod::destructor!(this, OpenId: CLASSNAME); - } - /// Create a new OpenId client instance #[export(raw_return)] pub fn discover( @@ -45,12 +23,12 @@ mod export { redirect_url: &str, ) -> Result { let open_id = OpenIdAuthenticator::discover(&config, redirect_url)?; - bless( - class, - Box::new(OpenId { + Ok(perlmod::instantiate_magic!( + &class, + MAGIC => Box::new(OpenId { inner: Mutex::new(open_id), - }), - ) + }) + )) } #[export]