From: Filip Schauer <f.schauer@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH installer] fetch-answer: encode unsafe characters in partition label
Date: Tue, 19 Nov 2024 15:59:34 +0100 [thread overview]
Message-ID: <20241119145934.102126-1-f.schauer@proxmox.com> (raw)
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.schauer@proxmox.com>
---
.../src/fetch_plugins/partition.rs | 30 ++++++++++++++-----
1 file changed, 22 insertions(+), 8 deletions(-)
diff --git a/proxmox-fetch-answer/src/fetch_plugins/partition.rs b/proxmox-fetch-answer/src/fetch_plugins/partition.rs
index 131f422..0563b2d 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,20 +65,21 @@ 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) {
- info!("Found partition with label '{partlabel}'");
+ let partlabel_enc = encode_partlabel(partlabel);
+ if let Some(path) = path_exists_logged(&partlabel_enc, search_path) {
+ info!("Found partition with label '{partlabel_enc}'");
return Ok(path);
}
- let partlabel_upper_case = partlabel.to_uppercase();
- if let Some(path) = path_exists_logged(&partlabel_upper_case, search_path) {
- info!("Found partition with label '{partlabel_upper_case}'");
+ let partlabel_upper_case_enc = encode_partlabel(&partlabel.to_uppercase());
+ if let Some(path) = path_exists_logged(&partlabel_upper_case_enc, search_path) {
+ info!("Found partition with label '{partlabel_upper_case_enc}'");
return Ok(path);
}
- let partlabel_lower_case = partlabel.to_lowercase();
- if let Some(path) = path_exists_logged(&partlabel_lower_case, search_path) {
- info!("Found partition with label '{partlabel_lower_case}'");
+ let partlabel_lower_case_enc = encode_partlabel(&partlabel.to_lowercase());
+ if let Some(path) = path_exists_logged(&partlabel_lower_case_enc, search_path) {
+ info!("Found partition with label '{partlabel_lower_case_enc}'");
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
next reply other threads:[~2024-11-19 15:00 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-19 14:59 Filip Schauer [this message]
2024-11-19 15:40 ` Christoph Heiss
2024-11-19 15:58 ` Filip Schauer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241119145934.102126-1-f.schauer@proxmox.com \
--to=f.schauer@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.