You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildstream.apache.org by ju...@apache.org on 2026/10/16 12:55:17 UTC
(buildstream) 02/04: _casbaseddirectory.py: Validate `Directory` node names
This is an automated email from the ASF dual-hosted git repository.
juergbi pushed a commit to branch jbilleter/directory-validation
in repository https://gitbox.apache.org/repos/asf/buildstream.git
commit 0f7ff5c0571fdcce8807c9a17847343e6718bcea
Author: Jürg Billeter <j...@bitron.ch>
AuthorDate: Fri Oct 2 11:10:14 2026 +0200
_casbaseddirectory.py: Validate `Directory` node names
The REAPI spec requires that every child in the directory must have a
path of exactly one segment. Raise an error if a `Directory` message
violates the spec.
---
src/buildstream/storage/_casbaseddirectory.py | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/src/buildstream/storage/_casbaseddirectory.py b/src/buildstream/storage/_casbaseddirectory.py
index 084ec0105..c03f6fd18 100644
--- a/src/buildstream/storage/_casbaseddirectory.py
+++ b/src/buildstream/storage/_casbaseddirectory.py
@@ -654,10 +654,12 @@ class CasBasedDirectory(Directory):
self.__subtree_read_only = prop.value == "true"
for dentry in pb2_directory.directories:
+ _validate_cas_node_name(dentry.name)
self.__index[dentry.name] = _IndexEntry(
self.__cas_cache, dentry.name, FileType.DIRECTORY, digest=dentry.digest
)
for entry in pb2_directory.files:
+ _validate_cas_node_name(entry.name)
mtime: Optional[timestamp_pb2.Timestamp]
if entry.node_properties.HasField("mtime"):
mtime = entry.node_properties.mtime
@@ -673,6 +675,7 @@ class CasBasedDirectory(Directory):
mtime=mtime,
)
for lentry in pb2_directory.symlinks:
+ _validate_cas_node_name(lentry.name)
self.__index[lentry.name] = _IndexEntry(
self.__cas_cache, lentry.name, FileType.SYMLINK, target=lentry.target
)
@@ -908,3 +911,17 @@ class CasBasedDirectory(Directory):
subdir.__add_files_to_result(path_prefix=relative_pathname, result=result)
else:
result.files_written.append(relative_pathname)
+
+
+# _validate_cas_node_name():
+#
+# Validates that a CAS Directory entry name is a single path segment.
+#
+# Args:
+# name (str): The name of a CAS Directory entry
+#
+def _validate_cas_node_name(name: str):
+ if os.path.basename(name) != name or name in ("", ".", ".."):
+ raise DirectoryError(
+ f"Invalid name in a CAS Directory node: '{name}' (every child in the directory must have a path of exactly one segment)"
+ )