partname: Correct fstools_partname_fallback_scan comparison
authorBrian Norris <computersforpeace@gmail.com>
Thu, 26 Jan 2023 06:18:15 +0000 (22:18 -0800)
committerChristian Marangi <ansuelsmth@gmail.com>
Sat, 4 Feb 2023 18:45:58 +0000 (19:45 +0100)
Commit 1ea5855e980c ("partname: Introduce fstools_partname_fallback_scan
option") had two problems:

1. The strcmp() aborted when the param *matched* 1; we wanted the
   inverse
2. It was too aggressive about skipping the fallback behavior. For
   devices that had no root= parameter, they would always attempt the
   fallback scan.

Fix both of those.

Fixes: 1ea5855e980c ("partname: Introduce fstools_partname_fallback_scan option")
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
[ add extra spacing between function ]
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
libfstools/partname.c

index f42322a49d5ba2d730d532c79d4475bc71ba2186..53ee600fcb24b968a3a20ab5b36ef7b8c3aa0091 100644 (file)
@@ -121,6 +121,8 @@ static struct volume *partname_volume_find(char *name)
        char *rootdev = NULL, *devname, *tmp;
        int j;
        bool found = false;
+       bool allow_fallback = false;
+       bool has_root = false;
        glob_t gl;
 
        if (get_var_from_file("/proc/cmdline", "fstools_ignore_partname", rootparam, sizeof(rootparam))) {
@@ -128,22 +130,28 @@ static struct volume *partname_volume_find(char *name)
                        return NULL;
        }
 
-       if (get_var_from_file("/proc/cmdline", "root", rootparam, sizeof(rootparam)) && rootparam[0] == '/') {
+       /*
+        * Some device may contains a GPT partition named rootfs_data that may not be suitable.
+        * To save from regression with old implementation that doesn't use fstools_ignore_partname to
+        * explicitly say that that partname scan should be ignored, make explicit that scanning each
+        * partition should be done by providing fstools_partname_fallback_scan=1 and skip partname scan
+        * in every other case.
+        */
+       if (get_var_from_file("/proc/cmdline", "fstools_partname_fallback_scan", rootparam, sizeof(rootparam))) {
+               if (!strcmp("1", rootparam))
+                       allow_fallback = true;
+       }
+
+       if (get_var_from_file("/proc/cmdline", "root", rootparam, sizeof(rootparam)))
+               has_root = true;
+
+       if (has_root && rootparam[0] == '/') {
                rootdev = rootdevname(rootparam);
                /* find partition on same device as rootfs */
                snprintf(ueventgstr, sizeof(ueventgstr), "%s/%s/*/uevent", block_dir_name, rootdev);
        } else {
-               /*
-                * Some device may contains a GPT partition named rootfs_data that may not be suitable.
-                * To save from regression with old implementation that doesn't use fstools_ignore_partname to
-                * explicitly say that that parname scan should be ignored, make explicit that scanning each
-                * partition should be done by providing fstools_partname_fallback_scan=1 and skip partname scan
-                * in every other case.
-                */
-               if (!get_var_from_file("/proc/cmdline", "fstools_partname_fallback_scan", rootparam, sizeof(rootparam)))
-                       return NULL;
-
-               if (!strcmp("1", rootparam))
+               /* For compatibility, devices with root= params must explicitly opt into this fallback. */
+               if (has_root && !allow_fallback)
                        return NULL;
 
                /* no useful 'root=' kernel cmdline parameter, find on any block device */