From ceff2690d2520e0f268a65ff24fe045a3c87feea Mon Sep 17 00:00:00 2001 From: Jan Verbeek Date: Mon, 13 Sep 2021 16:15:03 +0200 Subject: [PATCH] getgroups: Reuse buffer, add comment about performance --- src/uucore/src/lib/features/entries.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/uucore/src/lib/features/entries.rs b/src/uucore/src/lib/features/entries.rs index 61ed7f1e5..df3ab7b06 100644 --- a/src/uucore/src/lib/features/entries.rs +++ b/src/uucore/src/lib/features/entries.rs @@ -72,6 +72,7 @@ extern "C" { /// > to be used in a further call to getgroups(). #[cfg(not(target_os = "redox"))] pub fn get_groups() -> IOResult> { + let mut groups = Vec::new(); loop { let ngroups = match unsafe { getgroups(0, ptr::null_mut()) } { -1 => return Err(IOError::last_os_error()), @@ -80,7 +81,9 @@ pub fn get_groups() -> IOResult> { n => n, }; - let mut groups = vec![0; ngroups.try_into().unwrap()]; + // This is a small buffer, so we can afford to zero-initialize it and + // use safe Vec operations + groups.resize(ngroups.try_into().unwrap(), 0); let res = unsafe { getgroups(ngroups, groups.as_mut_ptr()) }; if res == -1 { let err = IOError::last_os_error();