summaryrefslogtreecommitdiff
path: root/include/linux
diff options
context:
space:
mode:
authorArd Biesheuvel <ardb@kernel.org>2026-09-09 10:10:03 +0200
committerArd Biesheuvel <ardb@kernel.org>2026-10-04 21:53:56 +0200
commit0f5a86b29fcc1c1f4e4be5d5899de52217ecd5be (patch)
treed56a910e3a5eb1a3faf3fb5d0f5e9aa25aa95693 /include/linux
parent4c0209bc31d26d1205fe0db29f33ce0290daf3d1 (diff)
downloadlinux-0f5a86b29fcc1c1f4e4be5d5899de52217ecd5be.tar.gz
linux-0f5a86b29fcc1c1f4e4be5d5899de52217ecd5be.zip
lib/ucs2_string: Split out ucs2_as_utf8_l() taking a separate limit
ucs2_as_utf8() takes a maxlength argument, which specifies how many bytes the function is permitted to store into the destination buffer. The same value is used as an upper bound for the ucs2_strnlen() invocation, which is reasonable in the general case, as each UCS-2 character produces at least one byte of UTF-8 output, and so there is never a need to process more than 'maxlength' UCS-2 characters. However, if the UCS-2 string is not NUL terminated, ucs2_strnlen() may read past the end of the buffer if 'maxlength' is set to a high value. Current callers pass UCS-2 strings that are expected to be NUL terminated, but for processing the load options in the EFI stub, a version is needed that takes a separate limit argument. So split that off from the current implementation. Reviewed-by: Vincent Mailhol <mailhol@kernel.org> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/ucs2_string.h11
1 files changed, 10 insertions, 1 deletions
diff --git a/include/linux/ucs2_string.h b/include/linux/ucs2_string.h
index c499ae809c7d..74f23ca5a967 100644
--- a/include/linux/ucs2_string.h
+++ b/include/linux/ucs2_string.h
@@ -14,7 +14,16 @@ ssize_t ucs2_strscpy(ucs2_char_t *dst, const ucs2_char_t *src, size_t count);
int ucs2_strncmp(const ucs2_char_t *a, const ucs2_char_t *b, size_t len);
unsigned long ucs2_utf8size(const ucs2_char_t *src);
+unsigned long
+ucs2_as_utf8_l(u8 *dest, const ucs2_char_t *src, unsigned long limit,
+ unsigned long maxlength);
+
+static inline
unsigned long ucs2_as_utf8(u8 *dest, const ucs2_char_t *src,
- unsigned long maxlength);
+ unsigned long maxlength)
+{
+ return ucs2_as_utf8_l(dest, src, ucs2_strnlen(src, maxlength),
+ maxlength);
+}
#endif /* _LINUX_UCS2_STRING_H_ */