From: Olivier Gayot <olivier.gayot@canonical.com>
To: Davidlohr Bueso <dave@stgolabs.net>, Jens Axboe <axboe@kernel.dk>,
Ming Lei <ming.lei@redhat.com>,
Pavel Begunkov <asml.silence@gmail.com>,
linux-efi@vger.kernel.org, linux-block@vger.kernel.org,
linux-kernel@vger.kernel.org, io-uring@vger.kernel.org
Cc: daniel.bungert@canonical.com,
Olivier Gayot <olivier.gayot@canonical.com>
Subject: [PATCH v2 1/1 RESEND] block: fix conversion of GPT partition name to 7-bit
Date: Tue, 18 Feb 2025 15:01:17 +0100 [thread overview]
Message-ID: <4cac90c2-e414-4ebb-ae62-2a4589d9dc6e@canonical.com> (raw)
In-Reply-To: <54095d2f-daea-4e4a-9542-f6a2b7603672@canonical.com>
The utf16_le_to_7bit function claims to, naively, convert a UTF-16
string to a 7-bit ASCII string. By naively, we mean that it:
* drops the first byte of every character in the original UTF-16 string
* checks if all characters are printable, and otherwise replaces them
by exclamation mark "!".
This means that theoretically, all characters outside the 7-bit ASCII
range should be replaced by another character. Examples:
* lower-case alpha (ɒ) 0x0252 becomes 0x52 (R)
* ligature OE (œ) 0x0153 becomes 0x53 (S)
* hangul letter pieup (ㅂ) 0x3142 becomes 0x42 (B)
* upper-case gamma (Ɣ) 0x0194 becomes 0x94 (not printable) so gets
replaced by "!"
The result of this conversion for the GPT partition name is passed to
user-space as PARTNAME via udev, which is confusing and feels questionable.
However, there is a flaw in the conversion function itself. By dropping
one byte of each character and using isprint() to check if the remaining
byte corresponds to a printable character, we do not actually guarantee
that the resulting character is 7-bit ASCII.
This happens because we pass 8-bit characters to isprint(), which
in the kernel returns 1 for many values > 0x7f - as defined in ctype.c.
This results in many values which should be replaced by "!" to be kept
as-is, despite not being valid 7-bit ASCII. Examples:
* e with acute accent (é) 0x00E9 becomes 0xE9 - kept as-is because
isprint(0xE9) returns 1.
* euro sign (€) 0x20AC becomes 0xAC - kept as-is because isprint(0xAC)
returns 1.
Fixed by using a mask of 7 bits instead of 8 bits before calling
isprint.
Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
---
V1 -> V2: No change - resubmitted with subsystem maintainers in CC
block/partitions/efi.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/block/partitions/efi.c b/block/partitions/efi.c
index 5e9be13a56a8..7acba66eed48 100644
--- a/block/partitions/efi.c
+++ b/block/partitions/efi.c
@@ -682,7 +682,7 @@ static void utf16_le_to_7bit(const __le16 *in, unsigned int size, u8 *out)
out[size] = 0;
while (i < size) {
- u8 c = le16_to_cpu(in[i]) & 0xff;
+ u8 c = le16_to_cpu(in[i]) & 0x7f;
if (c && !isprint(c))
c = '!';
prev parent reply other threads:[~2025-02-18 14:01 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-18 13:59 [PATCH v2 0/1 RESEND] block: fix conversion of GPT partition name to 7-bit Olivier Gayot
2025-02-18 14:01 ` Olivier Gayot [this message]
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=4cac90c2-e414-4ebb-ae62-2a4589d9dc6e@canonical.com \
--to=olivier.gayot@canonical.com \
--cc=asml.silence@gmail.com \
--cc=axboe@kernel.dk \
--cc=daniel.bungert@canonical.com \
--cc=dave@stgolabs.net \
--cc=io-uring@vger.kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-efi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ming.lei@redhat.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.