From: Chali Anis <[email protected]>

Add get_prefix_path() to compute the filesystem prefix of a BLSpec
entry by locating the deepest /loader/entries/ component in the
configuration path. This ensures correct rootpath extraction for
nested loader directories, mixed path layouts, duplicate segments,
and paths without valid loader entries. If no prefix is found,
fall back to get_mounted_path().

Signed-off-by: Chali Anis <[email protected]>
---
 common/blspec.c | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/common/blspec.c b/common/blspec.c
index 80ebe256ceaf..ad94d4d6be64 100644
--- a/common/blspec.c
+++ b/common/blspec.c
@@ -391,6 +391,29 @@ static bool entry_is_match_machine_id(struct blspec_entry 
*entry)
        return ret;
 }
 
+/*
+ * Return the path prefix before the deepest "/loader/entries/" component
+ * in @configname. Falls back to the mounted path if none is found.
+ */
+static char *get_blspec_prefix_path(char *configname)
+{
+       char *p;
+       char *scfg = configname;
+       char *save = NULL;
+
+       while ((p = strstr(scfg, "/loader/entries/")) != NULL) {
+               if (p - configname > 0)
+                       save = p;
+
+               scfg = p + 1;
+       }
+
+       if (save && save - configname > 0)
+               return xstrndup(configname, save - configname);
+
+       return get_mounted_path(configname);
+}
+
 static int __blspec_scan_file(struct bootentries *bootentries, const char 
*root,
                              const char *configname)
 {
@@ -404,7 +427,7 @@ static int __blspec_scan_file(struct bootentries 
*bootentries, const char *root,
        if (IS_ERR(entry))
                return PTR_ERR(entry);
 
-       root = root ?: get_mounted_path(configname);
+       root = root ?: get_blspec_prefix_path(configname);
        entry->rootpath = xstrdup_const(root);
        entry->configpath = xstrdup_const(configname);
        entry->cdev = get_cdev_by_mountpath(root);
-- 
2.49.0


Reply via email to