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

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

commit 6cd5981e8cb9d4d09a79700fd8d2dcce7ff6c189
Author: Jürg Billeter <[email protected]>
AuthorDate: Fri Nov 29 11:57:33 2024 +0000

    _loader/loader.py: Add `None` checks for shallow loading
    
    When performing shallow loads without loading subprojects,
    `get_loader()` may return `None`. Add checks for that to fix crashes
    dereferencing `None`.
---
 src/buildstream/_loader/loader.py | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/src/buildstream/_loader/loader.py 
b/src/buildstream/_loader/loader.py
index f142b2655..63b890743 100644
--- a/src/buildstream/_loader/loader.py
+++ b/src/buildstream/_loader/loader.py
@@ -437,6 +437,11 @@ class Loader:
             link_target = element.link_target.as_str()  # pylint: 
disable=no-member
             _, filename, loader = self._parse_name(link_target, 
element.link_target, load_subprojects=load_subprojects)
 
+            if not loader:
+                # `loader` should never be None if `load_subprojects` is True
+                assert not load_subprojects
+                return None
+
             #
             # Redirect the loading of the file and it's dependencies to the 
appropriate loader,
             # which might or might not be the same loader.
@@ -465,6 +470,11 @@ class Loader:
 
         top_element = self._load_one_file(filename, provenance_node, 
load_subprojects=load_subprojects)
 
+        if not top_element:
+            # `_load_one_file` should not return None if `load_subprojects` is 
True
+            assert not load_subprojects
+            return None
+
         # Already loaded dependencies for a fully loaded element, early return.
         #
         if top_element.fully_loaded:
@@ -501,6 +511,11 @@ class Loader:
 
                     dep_element = self._load_one_file(dep.name, dep.node, 
load_subprojects=load_subprojects)
 
+                    if not dep_element:
+                        # `_load_one_file` should not return None if 
`load_subprojects` is True
+                        assert not load_subprojects
+                        return None
+
                     # If the loaded element is not fully loaded, queue up the 
dependencies to be loaded in this loop.
                     #
                     if not dep_element.fully_loaded:
@@ -773,6 +788,11 @@ class Loader:
             _, filename, loader = self._parse_name(
                 load_element.link_target.as_str(), load_element.link_target, 
load_subprojects=load_subprojects
             )
+            if not loader:
+                # `loader` should never be None if `load_subprojects` is True
+                assert not load_subprojects
+                return None
+
             return loader.get_loader(filename, load_element.link_target, 
load_subprojects=load_subprojects)
 
         # If we're only performing a lookup, we're done here.

Reply via email to