* [PATCH v3 0/3] platform/x86: hp-bioscfg: string buffer and password fixes
@ 2026-09-30 18:30 Muhammad Bilal
2026-09-30 18:30 ` [PATCH v3 1/3] platform/x86: hp-bioscfg: fix OOB reads in hp_get_string_from_buffer() Muhammad Bilal
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Muhammad Bilal @ 2026-09-30 18:30 UTC (permalink / raw)
To: jorge.lopez2, hansg, ilpo.jarvinen
Cc: andy.shevchenko, platform-driver-x86, linux-kernel, stable,
Muhammad Bilal
Fix string parsing in hp_get_string_from_buffer() and make over-length
password writes fail.
Changes in v3:
- Drop Suggested-by: Andy Shevchenko from patch 2, tidy its includes
and declarations (Andy)
- Return -E2BIG instead of -ERANGE in patch 3 (Andy)
- Drop a blank line in the declarations in patch 1 (Andy)
Changes in v2:
- Split the hp_get_string_from_buffer() fix in two (Ilpo)
- Drop the lib/string_helpers patch, use @only of string_escape_mem()
instead (Andy)
- Add patch 3
Muhammad Bilal (3):
platform/x86: hp-bioscfg: fix OOB reads in hp_get_string_from_buffer()
platform/x86: hp-bioscfg: fix non-ASCII truncation in
hp_get_string_from_buffer()
platform/x86: hp-bioscfg: return -E2BIG from validate_password_input()
drivers/platform/x86/hp/hp-bioscfg/bioscfg.c | 79 ++++++-------------
.../x86/hp/hp-bioscfg/passwdobj-attributes.c | 7 +-
2 files changed, 28 insertions(+), 58 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 1/3] platform/x86: hp-bioscfg: fix OOB reads in hp_get_string_from_buffer()
2026-09-30 18:30 [PATCH v3 0/3] platform/x86: hp-bioscfg: string buffer and password fixes Muhammad Bilal
@ 2026-09-30 18:30 ` Muhammad Bilal
2026-09-30 18:30 ` [PATCH v3 2/3] platform/x86: hp-bioscfg: fix non-ASCII truncation " Muhammad Bilal
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Muhammad Bilal @ 2026-09-30 18:30 UTC (permalink / raw)
To: jorge.lopez2, hansg, ilpo.jarvinen
Cc: andy.shevchenko, platform-driver-x86, linux-kernel, stable,
Muhammad Bilal
The escape prescan loop uses 'size' as both its bound and its
accumulator, so each escape character found extends the loop and
reads past the end of src[].
Use the original u16 count as the loop bound. Also include the 2-byte
length prefix in the bounds check, pass the u16 count instead of the
byte count to utf16s_to_utf8s(), and advance the buffer by the bytes
actually consumed instead of the escape-inflated count.
Tested on HP EliteBook 840 G2 (Fedora 44, Linux 7.2.7).
Suggested-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Fixes: a34fc329b189 ("platform/x86: hp-bioscfg: bioscfg")
Cc: stable@vger.kernel.org
Signed-off-by: Muhammad Bilal <meatuni001@gmail.com>
---
Changes in v3:
- Drop a blank line in the declarations (Andy)
- Mention the buffer advance in the changelog
Changes in v2:
- Split the bounds and prescan fix out of the conversion rewrite (Ilpo)
drivers/platform/x86/hp/hp-bioscfg/bioscfg.c | 25 +++++++++++---------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c b/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c
index 309634c..74a9086 100644
--- a/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c
+++ b/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c
@@ -54,8 +54,8 @@ int hp_get_integer_from_buffer(u8 **buffer, u32 *buffer_size, u32 *integer)
int hp_get_string_from_buffer(u8 **buffer, u32 *buffer_size, char *dst, u32 dst_size)
{
u16 *src = (u16 *)*buffer;
+ u16 orig_size;
u16 src_size;
-
u16 size;
int i;
int conv_dst_size;
@@ -63,17 +63,20 @@ int hp_get_string_from_buffer(u8 **buffer, u32 *buffer_size, char *dst, u32 dst_
if (*buffer_size < sizeof(u16))
return -EINVAL;
- src_size = *(src++);
- /* size value in u16 chars */
- size = src_size / sizeof(u16);
+ src_size = *src;
- /* Ensure there is enough space remaining to read and convert
- * the string
+ /* Ensure there is enough space remaining for the length prefix
+ * just read plus the string data it describes.
*/
- if (*buffer_size < src_size)
+ if (*buffer_size < sizeof(u16) + src_size)
return -EINVAL;
- for (i = 0; i < size; i++)
+ src++;
+ /* size value in u16 chars */
+ orig_size = src_size / sizeof(u16);
+ size = orig_size;
+
+ for (i = 0; i < orig_size; i++)
if (src[i] == '\\' ||
src[i] == '\r' ||
src[i] == '\n' ||
@@ -91,7 +94,7 @@ int hp_get_string_from_buffer(u8 **buffer, u32 *buffer_size, char *dst, u32 dst_
/*
* convert from UTF-16 unicode to ASCII
*/
- utf16s_to_utf8s(src, src_size, UTF16_HOST_ENDIAN, dst, conv_dst_size);
+ utf16s_to_utf8s(src, orig_size, UTF16_HOST_ENDIAN, dst, conv_dst_size);
dst[conv_dst_size] = 0;
for (i = 0; i < conv_dst_size; i++) {
@@ -117,8 +120,8 @@ int hp_get_string_from_buffer(u8 **buffer, u32 *buffer_size, char *dst, u32 dst_
src++;
}
- *buffer = (u8 *)src;
- *buffer_size -= size * sizeof(u16);
+ *buffer += sizeof(u16) + src_size;
+ *buffer_size -= sizeof(u16) + src_size;
return size;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 2/3] platform/x86: hp-bioscfg: fix non-ASCII truncation in hp_get_string_from_buffer()
2026-09-30 18:30 [PATCH v3 0/3] platform/x86: hp-bioscfg: string buffer and password fixes Muhammad Bilal
2026-09-30 18:30 ` [PATCH v3 1/3] platform/x86: hp-bioscfg: fix OOB reads in hp_get_string_from_buffer() Muhammad Bilal
@ 2026-09-30 18:30 ` Muhammad Bilal
2026-09-30 18:30 ` [PATCH v3 3/3] platform/x86: hp-bioscfg: return -E2BIG from validate_password_input() Muhammad Bilal
2026-09-30 18:38 ` [PATCH v3 0/3] platform/x86: hp-bioscfg: string buffer and password fixes Muhammad Bilal
3 siblings, 0 replies; 5+ messages in thread
From: Muhammad Bilal @ 2026-09-30 18:30 UTC (permalink / raw)
To: jorge.lopez2, hansg, ilpo.jarvinen
Cc: andy.shevchenko, platform-driver-x86, linux-kernel, stable,
Muhammad Bilal
utf16s_to_utf8s() writes into dst, but the loop that follows
overwrites dst from the raw UTF-16 code units with truncating casts,
so any character above U+007F is mangled. For example, U+00E9 is
stored as 0xe9 instead of 0xc3 0xa9.
Convert into a scratch buffer first, then escape '\\', '\r', '\n' and
'\t' into dst with string_escape_mem(). Quotes are not escaped, so the
existing strreplace() still handles them.
Tested on HP EliteBook 840 G2 (Fedora 44, Linux 7.2.7).
Suggested-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Fixes: a34fc329b189 ("platform/x86: hp-bioscfg: bioscfg")
Cc: stable@vger.kernel.org
Signed-off-by: Muhammad Bilal <meatuni001@gmail.com>
---
Changes in v3:
- Drop Suggested-by: Andy Shevchenko
- Use string_helpers.h instead of string.h, keep reverse xmas tree
order of declarations (Andy)
Changes in v2:
- Split out of the combined fix (Ilpo)
- Use @only of string_escape_mem() instead of a new flag (Andy)
drivers/platform/x86/hp/hp-bioscfg/bioscfg.c | 62 +++++---------------
1 file changed, 14 insertions(+), 48 deletions(-)
diff --git a/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c b/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c
index 74a9086..e468995 100644
--- a/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c
+++ b/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c
@@ -11,7 +11,7 @@
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/printk.h>
-#include <linux/string.h>
+#include <linux/string_helpers.h>
#include <linux/wmi.h>
#include "bioscfg.h"
#include "../../firmware_attributes_class.h"
@@ -53,12 +53,12 @@ int hp_get_integer_from_buffer(u8 **buffer, u32 *buffer_size, u32 *integer)
int hp_get_string_from_buffer(u8 **buffer, u32 *buffer_size, char *dst, u32 dst_size)
{
+ char utf8_buf[MAX_BUFF_SIZE];
u16 *src = (u16 *)*buffer;
+ int escaped_len;
u16 orig_size;
u16 src_size;
- u16 size;
- int i;
- int conv_dst_size;
+ int utf8_len;
if (*buffer_size < sizeof(u16))
return -EINVAL;
@@ -74,56 +74,22 @@ int hp_get_string_from_buffer(u8 **buffer, u32 *buffer_size, char *dst, u32 dst_
src++;
/* size value in u16 chars */
orig_size = src_size / sizeof(u16);
- size = orig_size;
-
- for (i = 0; i < orig_size; i++)
- if (src[i] == '\\' ||
- src[i] == '\r' ||
- src[i] == '\n' ||
- src[i] == '\t')
- size++;
- /*
- * Conversion is limited to destination string max number of
- * bytes.
- */
- conv_dst_size = size;
- if (size >= dst_size)
- conv_dst_size = dst_size - 1;
+ utf8_len = utf16s_to_utf8s(src, orig_size, UTF16_HOST_ENDIAN,
+ utf8_buf, sizeof(utf8_buf));
- /*
- * convert from UTF-16 unicode to ASCII
- */
- utf16s_to_utf8s(src, orig_size, UTF16_HOST_ENDIAN, dst, conv_dst_size);
- dst[conv_dst_size] = 0;
-
- for (i = 0; i < conv_dst_size; i++) {
- if (*src == '\\' ||
- *src == '\r' ||
- *src == '\n' ||
- *src == '\t') {
- dst[i++] = '\\';
- if (i == conv_dst_size)
- break;
- }
-
- if (*src == '\r')
- dst[i] = 'r';
- else if (*src == '\n')
- dst[i] = 'n';
- else if (*src == '\t')
- dst[i] = 't';
- else if (*src == '"')
- dst[i] = '\'';
- else
- dst[i] = *src;
- src++;
- }
+ escaped_len = string_escape_mem(utf8_buf, utf8_len, dst, dst_size - 1,
+ ESCAPE_SPACE | ESCAPE_SPECIAL,
+ "\\\r\n\t");
+ if (escaped_len > dst_size - 1)
+ escaped_len = dst_size - 1;
+ dst[escaped_len] = '\0';
+ strreplace(dst, '"', '\'');
*buffer += sizeof(u16) + src_size;
*buffer_size -= sizeof(u16) + src_size;
- return size;
+ return escaped_len;
}
int hp_get_common_data_from_buffer(u8 **buffer_ptr, u32 *buffer_size,
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 3/3] platform/x86: hp-bioscfg: return -E2BIG from validate_password_input()
2026-09-30 18:30 [PATCH v3 0/3] platform/x86: hp-bioscfg: string buffer and password fixes Muhammad Bilal
2026-09-30 18:30 ` [PATCH v3 1/3] platform/x86: hp-bioscfg: fix OOB reads in hp_get_string_from_buffer() Muhammad Bilal
2026-09-30 18:30 ` [PATCH v3 2/3] platform/x86: hp-bioscfg: fix non-ASCII truncation " Muhammad Bilal
@ 2026-09-30 18:30 ` Muhammad Bilal
2026-09-30 18:38 ` [PATCH v3 0/3] platform/x86: hp-bioscfg: string buffer and password fixes Muhammad Bilal
3 siblings, 0 replies; 5+ messages in thread
From: Muhammad Bilal @ 2026-09-30 18:30 UTC (permalink / raw)
To: jorge.lopez2, hansg, ilpo.jarvinen
Cc: andy.shevchenko, platform-driver-x86, linux-kernel, stable,
Muhammad Bilal
validate_password_input() returns the positive INVALID_BIOS_AUTH on
rejection. store_password_instance() skips the store on nonzero ret,
but its final "return ret < 0 ? ret : count" treats the positive value
as success, so userspace sees count instead of an error.
Return -E2BIG for an invalid password length.
Tested on HP EliteBook 840 G2 (Fedora 44, Linux 7.2.7): writing 999
bytes to current_password returned 999 before this change.
Fixes: 8646a3b5ee3a ("platform/x86: hp-bioscfg: passwdobj-attributes")
Cc: stable@vger.kernel.org
Signed-off-by: Muhammad Bilal <meatuni001@gmail.com>
---
Changes in v3:
- Return -E2BIG instead of -ERANGE (Andy)
Changes in v2:
- New patch
drivers/platform/x86/hp/hp-bioscfg/passwdobj-attributes.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/platform/x86/hp/hp-bioscfg/passwdobj-attributes.c b/drivers/platform/x86/hp/hp-bioscfg/passwdobj-attributes.c
index a9e1786..3f4c45d 100644
--- a/drivers/platform/x86/hp/hp-bioscfg/passwdobj-attributes.c
+++ b/drivers/platform/x86/hp/hp-bioscfg/passwdobj-attributes.c
@@ -70,12 +70,13 @@ static int validate_password_input(int instance_id, const char *buf)
length--;
if (length > MAX_PASSWD_SIZE)
- return INVALID_BIOS_AUTH;
+ return -E2BIG;
if (password_data->min_password_length > length ||
password_data->max_password_length < length)
- return INVALID_BIOS_AUTH;
- return SUCCESS;
+ return -E2BIG;
+
+ return 0;
}
ATTRIBUTE_N_PROPERTY_SHOW(is_enabled, password);
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v3 0/3] platform/x86: hp-bioscfg: string buffer and password fixes
2026-09-30 18:30 [PATCH v3 0/3] platform/x86: hp-bioscfg: string buffer and password fixes Muhammad Bilal
` (2 preceding siblings ...)
2026-09-30 18:30 ` [PATCH v3 3/3] platform/x86: hp-bioscfg: return -E2BIG from validate_password_input() Muhammad Bilal
@ 2026-09-30 18:38 ` Muhammad Bilal
3 siblings, 0 replies; 5+ messages in thread
From: Muhammad Bilal @ 2026-09-30 18:38 UTC (permalink / raw)
To: jorge.lopez2, hansg, ilpo.jarvinen
Cc: andy.shevchenko, platform-driver-x86, linux-kernel, stable
Hi
Please Ignore this patch series, as I noticed an issue.
I will send a fixed v4 shortly.
On Wed, Sep 30, 2026 at 11:31 PM Muhammad Bilal <meatuni001@gmail.com> wrote:
>
> Fix string parsing in hp_get_string_from_buffer() and make over-length
> password writes fail.
>
> Changes in v3:
> - Drop Suggested-by: Andy Shevchenko from patch 2, tidy its includes
> and declarations (Andy)
> - Return -E2BIG instead of -ERANGE in patch 3 (Andy)
> - Drop a blank line in the declarations in patch 1 (Andy)
>
> Changes in v2:
> - Split the hp_get_string_from_buffer() fix in two (Ilpo)
> - Drop the lib/string_helpers patch, use @only of string_escape_mem()
> instead (Andy)
> - Add patch 3
>
> Muhammad Bilal (3):
> platform/x86: hp-bioscfg: fix OOB reads in hp_get_string_from_buffer()
> platform/x86: hp-bioscfg: fix non-ASCII truncation in
> hp_get_string_from_buffer()
> platform/x86: hp-bioscfg: return -E2BIG from validate_password_input()
>
> drivers/platform/x86/hp/hp-bioscfg/bioscfg.c | 79 ++++++-------------
> .../x86/hp/hp-bioscfg/passwdobj-attributes.c | 7 +-
> 2 files changed, 28 insertions(+), 58 deletions(-)
>
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-09-30 18:38 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-30 18:30 [PATCH v3 0/3] platform/x86: hp-bioscfg: string buffer and password fixes Muhammad Bilal
2026-09-30 18:30 ` [PATCH v3 1/3] platform/x86: hp-bioscfg: fix OOB reads in hp_get_string_from_buffer() Muhammad Bilal
2026-09-30 18:30 ` [PATCH v3 2/3] platform/x86: hp-bioscfg: fix non-ASCII truncation " Muhammad Bilal
2026-09-30 18:30 ` [PATCH v3 3/3] platform/x86: hp-bioscfg: return -E2BIG from validate_password_input() Muhammad Bilal
2026-09-30 18:38 ` [PATCH v3 0/3] platform/x86: hp-bioscfg: string buffer and password fixes Muhammad Bilal
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.