diff options
author | Brian Norris <computersforpeace@gmail.com> | 2023-01-25 22:18:15 -0800 |
---|---|---|
committer | Christian Marangi <ansuelsmth@gmail.com> | 2023-02-04 19:45:58 +0100 |
commit | 14d535e4485dc030deecbba9ab493c379df5c237 (patch) | |
tree | 7534ff8cdee7ab959cd7e2e0f30de475ccee0c62 | |
parent | 1ea5855e980cd88766dd9f615e78e7dd6edfbb74 (diff) | |
download | fstools-14d535e4485dc030deecbba9ab493c379df5c237.tar.gz |
partname: Correct fstools_partname_fallback_scan comparison
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>
-rw-r--r-- | libfstools/partname.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/libfstools/partname.c b/libfstools/partname.c index f42322a..53ee600 100644 --- a/libfstools/partname.c +++ b/libfstools/partname.c @@ -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 */ |