Skip to content

Commit 50cbdaf

Browse files
JustinStittrafaeljw
authored andcommitted
PNP: 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. After having precisely calculated the lengths and ensuring we don't overflow the buffer, this really decays to just a memcpy. Let's not use a C string api as it makes the intention of the code confusing. It'd be nice to use strscpy() in this case (as we clearly want NUL-termination) because it'd clean up the code a bit. However, I don't quite know enough about what is going on here to justify a drop-in replacement -- too much bit magic and why (PNP_NAME_LEN - 2)? I'm afraid using strscpy() may result in copying too many or too few bytes into our dev->name buffer resulting in different behavior. At least using memcpy() we can ensure the behavior is exactly the same. Side note: NUL-padding is not required because insert_device() calls pnpbios_parse_data_stream() with a zero-allocated `dev`: 299 | static int __init insert_device(struct pnp_bios_node *node) { ... 312 | dev = pnp_alloc_dev(&pnpbios_protocol, node->handle, id); ... 316 | pnpbios_parse_data_stream(dev, node); then pnpbios_parse_data_stream() calls pnpbios_parse_compatible_ids(). Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings [1] Link: KSPP/linux#90 Signed-off-by: Justin Stitt <[email protected]> Reviewed-by: Kees Cook <[email protected]> Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent eda1a74 commit 50cbdaf

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

drivers/pnp/pnpbios/rsparser.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -454,8 +454,8 @@ static unsigned char *pnpbios_parse_compatible_ids(unsigned char *p,
454454
switch (tag) {
455455

456456
case LARGE_TAG_ANSISTR:
457-
strncpy(dev->name, p + 3,
458-
len >= PNP_NAME_LEN ? PNP_NAME_LEN - 2 : len);
457+
memcpy(dev->name, p + 3,
458+
len >= PNP_NAME_LEN ? PNP_NAME_LEN - 2 : len);
459459
dev->name[len >=
460460
PNP_NAME_LEN ? PNP_NAME_LEN - 1 : len] = '\0';
461461
break;

0 commit comments

Comments
 (0)