dm cache metadata: replace deprecated strncpy with strscpy
authorJustin Stitt <justinstitt@google.com>
Mon, 25 Sep 2023 06:13:12 +0000 (06:13 +0000)
committerMike Snitzer <snitzer@kernel.org>
Mon, 23 Oct 2023 17:02:05 +0000 (13:02 -0400)
commitac4149ba7efd6bc327c1e15e812091984f3a16b2
treeabdae55ab7fb5a4dd29b56e75aedc6bf003f35d9
parentf1445032173d4a49eb8b4a0808db499966897d9a
dm cache metadata: replace deprecated strncpy with strscpy

`strncpy` is deprecated for use on NUL-terminated destination strings
[1] and as such we should prefer more robust and less ambiguous string
interfaces.

It seems `cmd->policy_name` is intended to be NUL-terminated based on a
now changed line of code from Commit (c6b4fcbad044e6ff "dm: add cache
target"):
|       if (strcmp(cmd->policy_name, policy_name)) { // ...

However, now a length-bounded strncmp is used:
|       if (strncmp(cmd->policy_name, policy_name, sizeof(cmd->policy_name)))
... which means NUL-terminated may not strictly be required. However, I
believe the intent of the code is clear and we should maintain
NUL-termination of policy_names.

Moreover, __begin_transaction_flags() zero-allocates `cmd` before
calling read_superblock_fields():
|       cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);

Also, `disk_super->policy_name` is zero-initialized
|       memset(disk_super->policy_name, 0, sizeof(disk_super->policy_name));
... therefore any NUL-padding is redundant.

Considering the above, a suitable replacement is `strscpy` [2] due to
the fact that it guarantees NUL-termination on the destination buffer
without unnecessarily NUL-padding.

Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings
Link: https://manpages.debian.org/testing/linux-manual-4.8/strscpy.9.en.html
Link: https://github.com/KSPP/linux/issues/90
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Justin Stitt <justinstitt@google.com>
Signed-off-by: Mike Snitzer <snitzer@kernel.org>
drivers/md/dm-cache-metadata.c