Ensure potentially unsafe characters in the partition label are encoded, preventing the installer from failing to find the answer partition when the label contains whitespaces or !"$%&'()*,/;<>?[\]^`{|}~
The encoding is done according to `blkid_encode_string` [0] in the blkid util, which is used by `/lib/udev/rules.d/60-persistent-storage.rules` to create a symlink under `/dev/disk/by-label/`. For example: "ANSWER PART" is encoded to "ANSWER\x20PART" [0] https://github.com/util-linux/util-linux/blob/master/libblkid/src/encode.c Signed-off-by: Filip Schauer <f.scha...@proxmox.com> Tested-by: Christoph Heiss <c.he...@proxmox.com> --- Changed since v1: * Log the non-encoded label instead of the encoded one when a partition is found. .../src/fetch_plugins/partition.rs | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/proxmox-fetch-answer/src/fetch_plugins/partition.rs b/proxmox-fetch-answer/src/fetch_plugins/partition.rs index 131f422..0f1fa7b 100644 --- a/proxmox-fetch-answer/src/fetch_plugins/partition.rs +++ b/proxmox-fetch-answer/src/fetch_plugins/partition.rs @@ -41,6 +41,19 @@ fn path_exists_logged(file_name: &str, search_path: &str) -> Option<PathBuf> { } } +fn encode_partlabel(input: &str) -> String { + input + .chars() + .map(|c| { + if (' '..='~').contains(&c) && !(c.is_ascii_alphanumeric() || "#+-.:=@_".contains(c)) { + format!("\\x{:02x}", c as u32) + } else { + c.to_string() + } + }) + .collect() +} + /// Searches for the exact case, upper and finally lower case existence of the partlabel in the /// search_path, in that order. /// @@ -52,19 +65,22 @@ fn path_exists_logged(file_name: &str, search_path: &str) -> Option<PathBuf> { /// * `partlabel_source` - Partition Label, used for matching, in the exact, upper and lower case /// * `search_path` - Path where to search for the partition label fn scan_partlabels(partlabel: &str, search_path: &str) -> Result<PathBuf> { - if let Some(path) = path_exists_logged(partlabel, search_path) { + let partlabel_enc = encode_partlabel(partlabel); + if let Some(path) = path_exists_logged(&partlabel_enc, search_path) { info!("Found partition with label '{partlabel}'"); return Ok(path); } let partlabel_upper_case = partlabel.to_uppercase(); - if let Some(path) = path_exists_logged(&partlabel_upper_case, search_path) { + let partlabel_upper_case_enc = encode_partlabel(&partlabel_upper_case); + if let Some(path) = path_exists_logged(&partlabel_upper_case_enc, search_path) { info!("Found partition with label '{partlabel_upper_case}'"); return Ok(path); } let partlabel_lower_case = partlabel.to_lowercase(); - if let Some(path) = path_exists_logged(&partlabel_lower_case, search_path) { + let partlabel_lower_case_enc = encode_partlabel(&partlabel_lower_case); + if let Some(path) = path_exists_logged(&partlabel_lower_case_enc, search_path) { info!("Found partition with label '{partlabel_lower_case}'"); return Ok(path); } -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel