feat(tvix/castore): carry name in ValidateNodeError::InvalidName

Change-Id: Ica288e94f3f6025d98ef7d56dc5d6f874ec921b7
Reviewed-on: https://cl.tvl.fyi/c/depot/+/9861
Tested-by: BuildkiteCI
Reviewed-by: flokli <flokli@flokli.de>
This commit is contained in:
edef 2023-10-27 12:44:22 +00:00
parent e525272019
commit 621739037f
2 changed files with 14 additions and 14 deletions

View file

@ -1,7 +1,7 @@
#![allow(clippy::derive_partial_eq_without_eq, non_snake_case)]
// https://github.com/hyperium/tonic/issues/1056
use bstr::ByteSlice;
use std::{collections::HashSet, iter::Peekable};
use std::{collections::HashSet, iter::Peekable, str};
use prost::Message;
@ -47,8 +47,8 @@ pub enum ValidateNodeError {
#[error("Invalid Digest length: {0}")]
InvalidDigestLen(usize),
/// Invalid name encountered
#[error("Invalid name")]
InvalidName,
#[error("Invalid name: {}", .0.as_bstr())]
InvalidName(Vec<u8>),
/// Invalid symlink target
#[error("Invalid symlink target: {}", .0.as_bstr())]
InvalidSymlinkTarget(Vec<u8>),
@ -63,9 +63,10 @@ fn validate_node_name(name: &[u8]) -> Result<(), ValidateNodeError> {
|| name.contains(&0x00)
|| name.contains(&b'/')
{
Err(ValidateNodeError::InvalidName)?;
}
Err(ValidateNodeError::InvalidName(name.to_owned()))
} else {
Ok(())
}
}
/// NamedNode is implemented for [FileNode], [DirectoryNode] and [SymlinkNode]
@ -122,14 +123,14 @@ impl node::Node {
directory_node.digest.len(),
))?;
}
validate_node_name(&directory_node.name)?;
validate_node_name(&directory_node.name)
}
// for a file root node, ensure the digest has the appropriate size.
node::Node::File(file_node) => {
if file_node.digest.len() != B3_LEN {
Err(ValidateNodeError::InvalidDigestLen(file_node.digest.len()))?;
}
validate_node_name(&file_node.name)?;
validate_node_name(&file_node.name)
}
// ensure the symlink target is not empty and doesn't contain null bytes.
node::Node::Symlink(symlink_node) => {
@ -138,10 +139,9 @@ impl node::Node {
symlink_node.target.to_vec(),
))?;
}
validate_node_name(&symlink_node.name)?;
validate_node_name(&symlink_node.name)
}
}
Ok(())
}
}

View file

@ -165,7 +165,7 @@ fn validate_invalid_names() {
..Default::default()
};
match d.validate().expect_err("must fail") {
ValidateDirectoryError::InvalidNode(n, ValidateNodeError::InvalidName) => {
ValidateDirectoryError::InvalidNode(n, ValidateNodeError::InvalidName(_)) => {
assert_eq!(n, b"")
}
_ => panic!("unexpected error"),
@ -182,7 +182,7 @@ fn validate_invalid_names() {
..Default::default()
};
match d.validate().expect_err("must fail") {
ValidateDirectoryError::InvalidNode(n, ValidateNodeError::InvalidName) => {
ValidateDirectoryError::InvalidNode(n, ValidateNodeError::InvalidName(_)) => {
assert_eq!(n, b".")
}
_ => panic!("unexpected error"),
@ -200,7 +200,7 @@ fn validate_invalid_names() {
..Default::default()
};
match d.validate().expect_err("must fail") {
ValidateDirectoryError::InvalidNode(n, ValidateNodeError::InvalidName) => {
ValidateDirectoryError::InvalidNode(n, ValidateNodeError::InvalidName(_)) => {
assert_eq!(n, b"..")
}
_ => panic!("unexpected error"),
@ -216,7 +216,7 @@ fn validate_invalid_names() {
..Default::default()
};
match d.validate().expect_err("must fail") {
ValidateDirectoryError::InvalidNode(n, ValidateNodeError::InvalidName) => {
ValidateDirectoryError::InvalidNode(n, ValidateNodeError::InvalidName(_)) => {
assert_eq!(n, b"\x00")
}
_ => panic!("unexpected error"),
@ -232,7 +232,7 @@ fn validate_invalid_names() {
..Default::default()
};
match d.validate().expect_err("must fail") {
ValidateDirectoryError::InvalidNode(n, ValidateNodeError::InvalidName) => {
ValidateDirectoryError::InvalidNode(n, ValidateNodeError::InvalidName(_)) => {
assert_eq!(n, b"foo/bar")
}
_ => panic!("unexpected error"),