Re: [PATCH v4] hwmon: (acpi_power_meter) replace open-coded kmemdup_nul

From: Kees Cook
Date: Mon Sep 25 2023 - 14:02:11 EST


On Mon, Sep 25, 2023 at 03:43:23AM +0000, Justin Stitt wrote:
> `strncpy` is deprecated for use on NUL-terminated destination strings [1].
>
> Let's refactor this kcalloc() + strncpy() into a kmemdup_nul() which has
> more obvious behavior and is less error prone.
>
> Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings [1]
> Link: https://github.com/KSPP/linux/issues/90
> Cc: linux-hardening@xxxxxxxxxxxxxxx
> Signed-off-by: Justin Stitt <justinstitt@xxxxxxxxxx>
> ---
> Changes in v4:
> - drop +1 from length arg (thanks Kees)
> - reword subject line (thanks Kees)
> - rebase onto 6465e260f4879080
> - Link to v3: https://lore.kernel.org/r/20230921-strncpy-drivers-hwmon-acpi_power_meter-c-v3-1-307552c6ec3f@xxxxxxxxxx
>
> Changes in v3:
> - refactor to use kmemdup_nul() (thanks Thomas and Kees)
> - change commit msg to reflect ^
> - rebase onto 2cf0f71562387282
> - Link to v2: https://lore.kernel.org/r/20230919-strncpy-drivers-hwmon-acpi_power_meter-c-v2-1-8348432d6442@xxxxxxxxxx
>
> Changes in v2:
> - use memcpy over strscpy (thanks Kees)
> - Link to v1: https://lore.kernel.org/r/20230914-strncpy-drivers-hwmon-acpi_power_meter-c-v1-1-905297479fe8@xxxxxxxxxx
> ---
> drivers/hwmon/acpi_power_meter.c | 5 ++---
> 1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/hwmon/acpi_power_meter.c b/drivers/hwmon/acpi_power_meter.c
> index fa28d447f0df..c13b5c8a0433 100644
> --- a/drivers/hwmon/acpi_power_meter.c
> +++ b/drivers/hwmon/acpi_power_meter.c
> @@ -796,14 +796,13 @@ static int read_capabilities(struct acpi_power_meter_resource *resource)
> goto error;
> }
>
> - *str = kcalloc(element->string.length + 1, sizeof(u8),
> - GFP_KERNEL);
> + *str = kmemdup_nul(element->string.pointer, element->string.length,
> + GFP_KERNEL);

This whitespace looks weird -- I'd expect this to line up with
"element", like this:

> + *str = kmemdup_nul(element->string.pointer, element->string.length,
> + GFP_KERNEL);

Otherwise, yes, looks correct.

--
Kees Cook