* [PATCH 0/3]: hp-wmi: fix various issues with
@ 2026-07-12 19:11 yahia
2026-07-12 19:11 ` [PATCH 1/3] hp-wmi: refactor to use __free yahia
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: yahia @ 2026-07-12 19:11 UTC (permalink / raw)
To: ilpo.jarvinen; +Cc: platform-driver-x86, yahia ahmed
From: yahia ahmed <yahia.a.abdrabou@gmail.com>
hp_wmi_perform_query() currently has potential security issue and
doesn't use cleanups like __free.
Patch 1 adds the __cleanup attribute to arg and obj variables and
removes the out label.
Patch 2 addresses a potential integer underflow flagged by sashiko that
hp_wmi_perform_query() currently uses the length reported by bios and
bios_return structure blindly, which can cause issues as passing an
small buffer or a bios returning a value smaller than bios_return will
lead to a large number being passed to memcpy, Fix this by adding a check
and exiting if bios_return is larger than the length reported by bios.
Patch 3 addresses a potential security issue flagged by sashiko that
kmalloc doesn't zero out the page before handing it, Fix this by using
kzalloc to zero the page and allocate enough memory rather than 128
bytes.
yahia (3):
hp-wmi: refactor to use __free
hp-wmi: fix potential integer underflow
hp-wmi: move from kmalloc to kzalloc
drivers/platform/x86/hp/hp-wmi.c | 26 ++++++++++++--------------
1 file changed, 12 insertions(+), 14 deletions(-)
--
2.55.0
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH 1/3] hp-wmi: refactor to use __free 2026-07-12 19:11 [PATCH 0/3]: hp-wmi: fix various issues with yahia @ 2026-07-12 19:11 ` yahia 2026-07-13 11:21 ` Ilpo Järvinen 2026-07-12 19:11 ` [PATCH 2/3] hp-wmi: fix potential integer underflow yahia 2026-07-12 19:11 ` [PATCH 3/3] hp-wmi: move from kmalloc to kzalloc yahia 2 siblings, 1 reply; 8+ messages in thread From: yahia @ 2026-07-12 19:11 UTC (permalink / raw) To: ilpo.jarvinen; +Cc: platform-driver-x86, yahia ahmed From: yahia ahmed <yahia.a.abdrabou@gmail.com> hp_wmi_query_perform currently() uses the out_free label to exit the function and free the memory, but doesn't use the __free cleanup attribute to simply the processes of exiting and freeing memory. Signed-off-by: yahia ahmed <yahia.a.abdrabou@gmail.com> --- drivers/platform/x86/hp/hp-wmi.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c index 8ba286ed8721..c924fbb5503f 100644 --- a/drivers/platform/x86/hp/hp-wmi.c +++ b/drivers/platform/x86/hp/hp-wmi.c @@ -581,8 +581,8 @@ static int hp_wmi_perform_query(int query, enum hp_wmi_command command, { struct acpi_buffer input, output = { ACPI_ALLOCATE_BUFFER, NULL }; struct bios_return *bios_return; - union acpi_object *obj = NULL; - struct bios_args *args = NULL; + union acpi_object *obj __free(kfree) = NULL; + struct bios_args *args __free(kfree) = NULL; int mid, actual_insize, actual_outsize; size_t bios_args_size; int ret; @@ -608,18 +608,16 @@ static int hp_wmi_perform_query(int query, enum hp_wmi_command command, ret = wmi_evaluate_method(HPWMI_BIOS_GUID, 0, mid, &input, &output); if (ret) - goto out_free; + return ret; obj = output.pointer; if (!obj) { - ret = -EINVAL; - goto out_free; + return -EINVAL; } if (obj->type != ACPI_TYPE_BUFFER) { pr_warn("query 0x%x returned an invalid object 0x%x\n", query, ret); - ret = -EINVAL; - goto out_free; + return -EINVAL; } bios_return = (struct bios_return *)obj->buffer.pointer; @@ -629,20 +627,16 @@ static int hp_wmi_perform_query(int query, enum hp_wmi_command command, if (ret != HPWMI_RET_UNKNOWN_COMMAND && ret != HPWMI_RET_UNKNOWN_CMDTYPE) pr_warn("query 0x%x returned error 0x%x\n", query, ret); - goto out_free; + return ret; } /* Ignore output data of zero size */ if (!outsize) - goto out_free; + return ret; actual_outsize = min(outsize, (int)(obj->buffer.length - sizeof(*bios_return))); memcpy(buffer, obj->buffer.pointer + sizeof(*bios_return), actual_outsize); memset(buffer + actual_outsize, 0, outsize - actual_outsize); - -out_free: - kfree(obj); - kfree(args); return ret; } -- 2.55.0 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] hp-wmi: refactor to use __free 2026-07-12 19:11 ` [PATCH 1/3] hp-wmi: refactor to use __free yahia @ 2026-07-13 11:21 ` Ilpo Järvinen 0 siblings, 0 replies; 8+ messages in thread From: Ilpo Järvinen @ 2026-07-13 11:21 UTC (permalink / raw) To: yahia; +Cc: platform-driver-x86 On Sun, 12 Jul 2026, yahia wrote: > From: yahia ahmed <yahia.a.abdrabou@gmail.com> > > hp_wmi_query_perform currently() uses the out_free label to exit the > function and free the memory, but doesn't use the __free cleanup __free() More generally, please include () into names which are directly referencing a C function name, macro, etc. that have parenthesis in their name in C as well. > attribute to simply the processes of exiting and freeing memory. > > Signed-off-by: yahia ahmed <yahia.a.abdrabou@gmail.com> > --- > drivers/platform/x86/hp/hp-wmi.c | 20 +++++++------------- > 1 file changed, 7 insertions(+), 13 deletions(-) > > diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c > index 8ba286ed8721..c924fbb5503f 100644 > --- a/drivers/platform/x86/hp/hp-wmi.c > +++ b/drivers/platform/x86/hp/hp-wmi.c > @@ -581,8 +581,8 @@ static int hp_wmi_perform_query(int query, enum hp_wmi_command command, > { > struct acpi_buffer input, output = { ACPI_ALLOCATE_BUFFER, NULL }; > struct bios_return *bios_return; > - union acpi_object *obj = NULL; > - struct bios_args *args = NULL; > + union acpi_object *obj __free(kfree) = NULL; > + struct bios_args *args __free(kfree) = NULL; > int mid, actual_insize, actual_outsize; > size_t bios_args_size; > int ret; > @@ -608,18 +608,16 @@ static int hp_wmi_perform_query(int query, enum hp_wmi_command command, > > ret = wmi_evaluate_method(HPWMI_BIOS_GUID, 0, mid, &input, &output); > if (ret) > - goto out_free; > + return ret; > > obj = output.pointer; > if (!obj) { > - ret = -EINVAL; > - goto out_free; > + return -EINVAL; > } > > if (obj->type != ACPI_TYPE_BUFFER) { > pr_warn("query 0x%x returned an invalid object 0x%x\n", query, ret); > - ret = -EINVAL; > - goto out_free; > + return -EINVAL; > } > > bios_return = (struct bios_return *)obj->buffer.pointer; > @@ -629,20 +627,16 @@ static int hp_wmi_perform_query(int query, enum hp_wmi_command command, > if (ret != HPWMI_RET_UNKNOWN_COMMAND && > ret != HPWMI_RET_UNKNOWN_CMDTYPE) > pr_warn("query 0x%x returned error 0x%x\n", query, ret); > - goto out_free; > + return ret; > } > > /* Ignore output data of zero size */ > if (!outsize) > - goto out_free; > + return ret; > > actual_outsize = min(outsize, (int)(obj->buffer.length - sizeof(*bios_return))); > memcpy(buffer, obj->buffer.pointer + sizeof(*bios_return), actual_outsize); > memset(buffer + actual_outsize, 0, outsize - actual_outsize); > - > -out_free: > - kfree(obj); > - kfree(args); > return ret; Can't this now be return 0; ? -- i. ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/3] hp-wmi: fix potential integer underflow 2026-07-12 19:11 [PATCH 0/3]: hp-wmi: fix various issues with yahia 2026-07-12 19:11 ` [PATCH 1/3] hp-wmi: refactor to use __free yahia @ 2026-07-12 19:11 ` yahia 2026-07-13 11:23 ` Ilpo Järvinen 2026-07-12 19:11 ` [PATCH 3/3] hp-wmi: move from kmalloc to kzalloc yahia 2 siblings, 1 reply; 8+ messages in thread From: yahia @ 2026-07-12 19:11 UTC (permalink / raw) To: ilpo.jarvinen; +Cc: platform-driver-x86, yahia ahmed, sashiko-bot From: yahia ahmed <yahia.a.abdrabou@gmail.com> hp_wmi_query_perform() currently calculates the output size of the returned buffer by subtracting the size of bios_return from the length sent, However if a malicious bios or a new bios not yet tracked or handled sends a length smaller than the size of bios_return, the calculation will underflow, then the result will be casted to a signed integer, as such the min() function will fail to set the size properly leading to a huge number to be passed to memcpy. Fix this by adding a check to ensure if the length returned by the bios is larger than bios_return. Reported-by: sashiko-bot@kernel.org Link: https://sashiko.dev/#/patchset/20260706143855.35002-1-yahia.a.abdrabou%40gmail.com Fixes: d35c9a029a73 ("platform/x86: hp-wmi: Don't log a warning on HPWMI_RET_UNKNOWN_COMMAND errors") Signed-off-by: yahia ahmed <yahia.a.abdrabou@gmail.com> --- drivers/platform/x86/hp/hp-wmi.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c index c924fbb5503f..3235ade2fa98 100644 --- a/drivers/platform/x86/hp/hp-wmi.c +++ b/drivers/platform/x86/hp/hp-wmi.c @@ -634,6 +634,10 @@ static int hp_wmi_perform_query(int query, enum hp_wmi_command command, if (!outsize) return ret; + if (obj->buffer.length < sizeof(*bios_return)) { + pr_warn("Bios returned invalid data"); + return -EINVAL; + } actual_outsize = min(outsize, (int)(obj->buffer.length - sizeof(*bios_return))); memcpy(buffer, obj->buffer.pointer + sizeof(*bios_return), actual_outsize); memset(buffer + actual_outsize, 0, outsize - actual_outsize); -- 2.55.0 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] hp-wmi: fix potential integer underflow 2026-07-12 19:11 ` [PATCH 2/3] hp-wmi: fix potential integer underflow yahia @ 2026-07-13 11:23 ` Ilpo Järvinen 2026-07-13 12:24 ` yahia 0 siblings, 1 reply; 8+ messages in thread From: Ilpo Järvinen @ 2026-07-13 11:23 UTC (permalink / raw) To: yahia; +Cc: platform-driver-x86, sashiko-bot On Sun, 12 Jul 2026, yahia wrote: > From: yahia ahmed <yahia.a.abdrabou@gmail.com> > > hp_wmi_query_perform() currently calculates the output size of the > returned buffer by subtracting the size of bios_return from the length > sent, However if a malicious bios or a new bios not yet tracked or > handled sends a length smaller than the size of bios_return, the > calculation will underflow, then the result will be casted to a signed > integer, as such the min() function will fail to set the size properly > leading to a huge number to be passed to memcpy. > > Fix this by adding a check to ensure if the length returned by the bios > is larger than bios_return. > > Reported-by: sashiko-bot@kernel.org > Link: https://sashiko.dev/#/patchset/20260706143855.35002-1-yahia.a.abdrabou%40gmail.com > Fixes: d35c9a029a73 ("platform/x86: hp-wmi: Don't log a warning on HPWMI_RET_UNKNOWN_COMMAND errors") > Signed-off-by: yahia ahmed <yahia.a.abdrabou@gmail.com> > --- > drivers/platform/x86/hp/hp-wmi.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c > index c924fbb5503f..3235ade2fa98 100644 > --- a/drivers/platform/x86/hp/hp-wmi.c > +++ b/drivers/platform/x86/hp/hp-wmi.c > @@ -634,6 +634,10 @@ static int hp_wmi_perform_query(int query, enum hp_wmi_command command, > if (!outsize) > return ret; > > + if (obj->buffer.length < sizeof(*bios_return)) { This driver is using a deprecated WMI API. The new WMI API may be able to do size checks for you so you don't need to add them to the driver side. > + pr_warn("Bios returned invalid data"); > + return -EINVAL; > + } > actual_outsize = min(outsize, (int)(obj->buffer.length - sizeof(*bios_return))); > memcpy(buffer, obj->buffer.pointer + sizeof(*bios_return), actual_outsize); > memset(buffer + actual_outsize, 0, outsize - actual_outsize); > -- i. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] hp-wmi: fix potential integer underflow 2026-07-13 11:23 ` Ilpo Järvinen @ 2026-07-13 12:24 ` yahia 0 siblings, 0 replies; 8+ messages in thread From: yahia @ 2026-07-13 12:24 UTC (permalink / raw) To: ilpo.jarvinen; +Cc: platform-driver-x86 Hi ilpo, Please drop this patch series as you are correct that hp_wmi_perform_query() uses the deprecated wmi api, i will send another another patch that rewrites it using the modern wmidev_evaluate_method() though i fear rewriting using the modern api and risk breaking all legacy devices using the encode_outsize_for_pvsz() function for example, which i believe is completely redundant on any hp laptop besides ones from 2008 to 2015. Best regards, yahia ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 3/3] hp-wmi: move from kmalloc to kzalloc 2026-07-12 19:11 [PATCH 0/3]: hp-wmi: fix various issues with yahia 2026-07-12 19:11 ` [PATCH 1/3] hp-wmi: refactor to use __free yahia 2026-07-12 19:11 ` [PATCH 2/3] hp-wmi: fix potential integer underflow yahia @ 2026-07-12 19:11 ` yahia 2026-07-13 11:30 ` Ilpo Järvinen 2 siblings, 1 reply; 8+ messages in thread From: yahia @ 2026-07-12 19:11 UTC (permalink / raw) To: ilpo.jarvinen; +Cc: platform-driver-x86, yahia ahmed, sashiko-bot From: yahia ahmed <yahia.a.abdrabou@gmail.com> hp_wmi_query_perform() currently uses kmalloc to allocate memory for the bios's response, though this creates a security hole pointed out by sashiko that when using kmalloc, it won't zero out the memory space, thus leaving information like passwords and other important data. Reported-by: sashiko-bot@kernel.org Link: https://sashiko.dev/#/message/20260706143855.35002-1-yahia.a.abdrabou%40gmail.com Fixes: 4b4967cbd268 ("platform/x86: hp-wmi: Changing bios_args.data to be dynamically allocated") Signed-off-by: yahia ahmed <yahia.a.abdrabou@gmail.com> --- drivers/platform/x86/hp/hp-wmi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c index 3235ade2fa98..f120900f536d 100644 --- a/drivers/platform/x86/hp/hp-wmi.c +++ b/drivers/platform/x86/hp/hp-wmi.c @@ -593,7 +593,7 @@ static int hp_wmi_perform_query(int query, enum hp_wmi_command command, actual_insize = max(insize, 128); bios_args_size = struct_size(args, data, actual_insize); - args = kmalloc(bios_args_size, GFP_KERNEL); + args = kzalloc(bios_args_size, GFP_KERNEL); if (!args) return -ENOMEM; -- 2.55.0 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 3/3] hp-wmi: move from kmalloc to kzalloc 2026-07-12 19:11 ` [PATCH 3/3] hp-wmi: move from kmalloc to kzalloc yahia @ 2026-07-13 11:30 ` Ilpo Järvinen 0 siblings, 0 replies; 8+ messages in thread From: Ilpo Järvinen @ 2026-07-13 11:30 UTC (permalink / raw) To: yahia; +Cc: platform-driver-x86, sashiko-bot On Sun, 12 Jul 2026, yahia wrote: kzalloc() > From: yahia ahmed <yahia.a.abdrabou@gmail.com> > > hp_wmi_query_perform() currently uses kmalloc to allocate memory for the kmalloc() > bios's response, though this creates a security hole pointed out by BIOS When you (or you as an extension of sashiko) claim "security hole", you must explain that one out how it materializes. Otherwise, I'll reject the patch on the ground of unsubstanciated claim in the changelog. That being said, it is generally useful to avoid kmalloc() but that's different reasoning. > sashiko that when using kmalloc, it won't zero out the memory space, thus kmalloc() > leaving information like passwords and other important data. I thought we had special functions for handling sensitive data such as passwords. Yeah, right, there's kfree_sensitive(). I think it would be better to drop the entire thus ... part. -- i. > > Reported-by: sashiko-bot@kernel.org > Link: https://sashiko.dev/#/message/20260706143855.35002-1-yahia.a.abdrabou%40gmail.com > Fixes: 4b4967cbd268 ("platform/x86: hp-wmi: Changing bios_args.data to be dynamically allocated") > Signed-off-by: yahia ahmed <yahia.a.abdrabou@gmail.com> > --- > drivers/platform/x86/hp/hp-wmi.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c > index 3235ade2fa98..f120900f536d 100644 > --- a/drivers/platform/x86/hp/hp-wmi.c > +++ b/drivers/platform/x86/hp/hp-wmi.c > @@ -593,7 +593,7 @@ static int hp_wmi_perform_query(int query, enum hp_wmi_command command, > > actual_insize = max(insize, 128); > bios_args_size = struct_size(args, data, actual_insize); > - args = kmalloc(bios_args_size, GFP_KERNEL); > + args = kzalloc(bios_args_size, GFP_KERNEL); > if (!args) > return -ENOMEM; > > ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-07-13 12:24 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-07-12 19:11 [PATCH 0/3]: hp-wmi: fix various issues with yahia 2026-07-12 19:11 ` [PATCH 1/3] hp-wmi: refactor to use __free yahia 2026-07-13 11:21 ` Ilpo Järvinen 2026-07-12 19:11 ` [PATCH 2/3] hp-wmi: fix potential integer underflow yahia 2026-07-13 11:23 ` Ilpo Järvinen 2026-07-13 12:24 ` yahia 2026-07-12 19:11 ` [PATCH 3/3] hp-wmi: move from kmalloc to kzalloc yahia 2026-07-13 11:30 ` Ilpo Järvinen
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.