Skip to content

Commit 942a4a6

Browse files
JustinStittij-intel
authored andcommitted
platform/x86: thinkpad_acpi: replace deprecated strncpy with memcpy
strncpy() is deprecated for use on NUL-terminated destination strings [1] and as such we should prefer more robust and less ambiguous interfaces. We expect ec_fw_string to be NUL-terminated based on its use with format strings in thinkpad_acpi.c: 11241 | pr_notice("ThinkPad firmware release %s doesn't match the known patterns\n", 11242 | ec_fw_string); Moreover, NUL-padding is not required since ec_fw_string is explicitly zero-initialized: 11185 | char ec_fw_string[18] = {0}; When carefully copying bytes from one buffer to another in pre-determined blocks (like what's happening here with dmi_data): | static void find_new_ec_fwstr(const struct dmi_header *dm, void *private) | { | char *ec_fw_string = (char *) private; | const char *dmi_data = (const char *)dm; | /* | * ThinkPad Embedded Controller Program Table on newer models | * | * Offset | Name | Width | Description | * ---------------------------------------------------- | * 0x00 | Type | BYTE | 0x8C | * 0x01 | Length | BYTE | | * 0x02 | Handle | WORD | Varies | * 0x04 | Signature | BYTEx6 | ASCII for "LENOVO" | * 0x0A | OEM struct offset | BYTE | 0x0B | * 0x0B | OEM struct number | BYTE | 0x07, for this structure | * 0x0C | OEM struct revision | BYTE | 0x01, for this format | * 0x0D | ECP version ID | STR ID | | * 0x0E | ECP release date | STR ID | | */ | | /* Return if data structure not match */ | if (dm->type != 140 || dm->length < 0x0F || | memcmp(dmi_data + 4, "LENOVO", 6) != 0 || | dmi_data[0x0A] != 0x0B || dmi_data[0x0B] != 0x07 || | dmi_data[0x0C] != 0x01) | return; | | /* fwstr is the first 8byte string */ | strncpy(ec_fw_string, dmi_data + 0x0F, 8); ... we shouldn't be using a C string api. Let's instead use memcpy() as this more properly relays the intended behavior. Do note that ec_fw_string will still end up being NUL-terminated since we are memcpy'ing only 8 bytes into a buffer full of 18 zeroes. There's still some trailing NUL-bytes there. To ensure this behavior, let's add a BUILD_BUG_ON checking the length leaves space for at least one trailing NUL-byte. Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings [1] Link: KSPP#90 Cc: Kees Cook <[email protected]> Signed-off-by: Justin Stitt <[email protected]> Reviewed-by: Mark Pearson <[email protected]> Reviewed-by: Kees Cook <[email protected]> Link: https://lore.kernel.org/r/20231020-strncpy-drivers-platform-x86-thinkpad_acpi-c-v1-1-312f2e33034f@google.com Reviewed-by: Ilpo Järvinen <[email protected]> Signed-off-by: Ilpo Järvinen <[email protected]>
1 parent e485c7a commit 942a4a6

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

drivers/platform/x86/thinkpad_acpi.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11226,6 +11226,8 @@ static char __init tpacpi_parse_fw_id(const char * const s,
1122611226
return '\0';
1122711227
}
1122811228

11229+
#define EC_FW_STRING_LEN 18
11230+
1122911231
static void find_new_ec_fwstr(const struct dmi_header *dm, void *private)
1123011232
{
1123111233
char *ec_fw_string = (char *) private;
@@ -11254,7 +11256,8 @@ static void find_new_ec_fwstr(const struct dmi_header *dm, void *private)
1125411256
return;
1125511257

1125611258
/* fwstr is the first 8byte string */
11257-
strncpy(ec_fw_string, dmi_data + 0x0F, 8);
11259+
BUILD_BUG_ON(EC_FW_STRING_LEN <= 8);
11260+
memcpy(ec_fw_string, dmi_data + 0x0F, 8);
1125811261
}
1125911262

1126011263
/* returns 0 - probe ok, or < 0 - probe error.
@@ -11264,7 +11267,7 @@ static int __must_check __init get_thinkpad_model_data(
1126411267
struct thinkpad_id_data *tp)
1126511268
{
1126611269
const struct dmi_device *dev = NULL;
11267-
char ec_fw_string[18] = {0};
11270+
char ec_fw_string[EC_FW_STRING_LEN] = {0};
1126811271
char const *s;
1126911272
char t;
1127011273

0 commit comments

Comments
 (0)