feat(nix-compat/store_path): validate_name over borrowed data

Change-Id: Ifeb6231f48d4ad267a7acd398b4b3b687ee4d560
Reviewed-on: https://cl.tvl.fyi/c/depot/+/9857
Reviewed-by: flokli <flokli@flokli.de>
Tested-by: BuildkiteCI
This commit is contained in:
edef 2023-10-27 12:02:29 +00:00
parent 6238a05868
commit b994f692d3
2 changed files with 10 additions and 6 deletions

View file

@ -1,6 +1,10 @@
use crate::nixbase32::{self, Nixbase32DecodeError}; use crate::nixbase32::{self, Nixbase32DecodeError};
use data_encoding::BASE64; use data_encoding::BASE64;
use std::{fmt, path::PathBuf, str::FromStr}; use std::{
fmt,
path::PathBuf,
str::{self, FromStr},
};
use thiserror; use thiserror;
#[cfg(target_family = "unix")] #[cfg(target_family = "unix")]
@ -111,7 +115,7 @@ impl StorePath {
} }
Ok(StorePath { Ok(StorePath {
name: validate_name(&s[ENCODED_DIGEST_SIZE + 1..])?, name: validate_name(&s[ENCODED_DIGEST_SIZE + 1..])?.to_owned(),
digest: digest.try_into().expect("size is known"), digest: digest.try_into().expect("size is known"),
}) })
} }
@ -129,7 +133,7 @@ impl StorePath {
/// Construct a [StorePath] from a name and digest. /// Construct a [StorePath] from a name and digest.
pub fn from_name_and_digest(name: String, digest: &[u8]) -> Result<StorePath, Error> { pub fn from_name_and_digest(name: String, digest: &[u8]) -> Result<StorePath, Error> {
Ok(Self { Ok(Self {
name: validate_name(name.as_bytes())?, name: validate_name(name.as_bytes())?.to_owned(),
digest: digest.try_into().map_err(|_| Error::InvalidLength())?, digest: digest.try_into().map_err(|_| Error::InvalidLength())?,
}) })
} }
@ -173,7 +177,7 @@ impl StorePath {
/// Checks a given &[u8] to match the restrictions for [StorePath::name], and /// Checks a given &[u8] to match the restrictions for [StorePath::name], and
/// returns the name as string if successful. /// returns the name as string if successful.
pub(crate) fn validate_name(s: &[u8]) -> Result<String, Error> { pub(crate) fn validate_name(s: &[u8]) -> Result<&str, Error> {
// Empty or excessively long names are not allowed. // Empty or excessively long names are not allowed.
if s.is_empty() || s.len() > 211 { if s.is_empty() || s.len() > 211 {
return Err(Error::InvalidLength()); return Err(Error::InvalidLength());
@ -194,7 +198,7 @@ pub(crate) fn validate_name(s: &[u8]) -> Result<String, Error> {
return Err(Error::InvalidName(s.to_vec(), i)); return Err(Error::InvalidName(s.to_vec(), i));
} }
Ok(String::from_utf8(s.to_vec()).unwrap()) Ok(str::from_utf8(s).unwrap())
} }
impl fmt::Display for StorePath { impl fmt::Display for StorePath {

View file

@ -167,7 +167,7 @@ fn build_store_path_from_fingerprint_parts<B: AsRef<[u8]>>(
name: B, name: B,
) -> Result<StorePath, Error> { ) -> Result<StorePath, Error> {
let name = name.as_ref(); let name = name.as_ref();
let name = super::validate_name(name.as_ref())?; let name = super::validate_name(name.as_ref())?.to_owned();
let digest = compress_hash(&{ let digest = compress_hash(&{
let mut h = Sha256::new(); let mut h = Sha256::new();