This is an automated email from the ASF dual-hosted git repository.

juergbi pushed a commit to branch jbilleter/checkout
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit c5cd0cbb2992e34463e2fa68aa517a412c5048b8
Author: Jürg Billeter <[email protected]>
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..5898b80db 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)"
+        )

Reply via email to