From c1eff8bbe94ecbaafb45eb3e80b9a0ad3e0d7537 Mon Sep 17 00:00:00 2001 From: Isaiah Inuwa Date: Fri, 20 Feb 2026 10:31:52 -0600 Subject: [PATCH] Optimize allocations for writing u16 ComBuffers --- .../win_webauthn/src/plugin/com.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/apps/desktop/desktop_native/win_webauthn/src/plugin/com.rs b/apps/desktop/desktop_native/win_webauthn/src/plugin/com.rs index 789c820f6b1..fb309865924 100644 --- a/apps/desktop/desktop_native/win_webauthn/src/plugin/com.rs +++ b/apps/desktop/desktop_native/win_webauthn/src/plugin/com.rs @@ -4,7 +4,7 @@ use std::{ alloc, - mem::{ManuallyDrop, MaybeUninit}, + mem::{ManuallyDrop, MaybeUninit, size_of}, ptr::{self, NonNull}, sync::{Arc, OnceLock}, }; @@ -426,15 +426,24 @@ impl ComBufferExt for &[u8] { impl ComBufferExt for Vec { fn to_com_buffer(&self) -> ComBuffer { - let buffer: Vec = self.iter().flat_map(|x| x.to_le_bytes()).collect(); - ComBuffer::from(&buffer) + self.as_slice().to_com_buffer() } } impl ComBufferExt for &[u16] { fn to_com_buffer(&self) -> ComBuffer { - let buffer: Vec = self.as_ref().iter().flat_map(|x| x.to_le_bytes()).collect(); - ComBuffer::from(&buffer) + let byte_len = self.len() * size_of::(); + let com_buffer = ComBuffer::alloc(byte_len, false); + // SAFETY: com_buffer.0 points to a valid COM allocation of byte_len bytes. + // We write every byte before the buffer is read. + unsafe { + let dst: *mut u8 = com_buffer.0.cast().as_ptr(); + for (i, &word) in self.iter().enumerate() { + dst.add(i * size_of::()) + .copy_from_nonoverlapping(word.to_le_bytes().as_ptr(), size_of::()); + } + } + com_buffer } }