mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-06 14:05:39 +00:00
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 (c6b4fcbad0
"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 [1]
Link: https://manpages.debian.org/testing/linux-manual-4.8/strscpy.9.en.html [2]
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>
This commit is contained in:
parent
f144503217
commit
ac4149ba7e
@ -597,7 +597,7 @@ static void read_superblock_fields(struct dm_cache_metadata *cmd,
|
||||
cmd->discard_nr_blocks = to_dblock(le64_to_cpu(disk_super->discard_nr_blocks));
|
||||
cmd->data_block_size = le32_to_cpu(disk_super->data_block_size);
|
||||
cmd->cache_blocks = to_cblock(le32_to_cpu(disk_super->cache_blocks));
|
||||
strncpy(cmd->policy_name, disk_super->policy_name, sizeof(cmd->policy_name));
|
||||
strscpy(cmd->policy_name, disk_super->policy_name, sizeof(cmd->policy_name));
|
||||
cmd->policy_version[0] = le32_to_cpu(disk_super->policy_version[0]);
|
||||
cmd->policy_version[1] = le32_to_cpu(disk_super->policy_version[1]);
|
||||
cmd->policy_version[2] = le32_to_cpu(disk_super->policy_version[2]);
|
||||
@ -707,7 +707,7 @@ static int __commit_transaction(struct dm_cache_metadata *cmd,
|
||||
disk_super->discard_block_size = cpu_to_le64(cmd->discard_block_size);
|
||||
disk_super->discard_nr_blocks = cpu_to_le64(from_dblock(cmd->discard_nr_blocks));
|
||||
disk_super->cache_blocks = cpu_to_le32(from_cblock(cmd->cache_blocks));
|
||||
strncpy(disk_super->policy_name, cmd->policy_name, sizeof(disk_super->policy_name));
|
||||
strscpy(disk_super->policy_name, cmd->policy_name, sizeof(disk_super->policy_name));
|
||||
disk_super->policy_version[0] = cpu_to_le32(cmd->policy_version[0]);
|
||||
disk_super->policy_version[1] = cpu_to_le32(cmd->policy_version[1]);
|
||||
disk_super->policy_version[2] = cpu_to_le32(cmd->policy_version[2]);
|
||||
@ -1726,7 +1726,7 @@ static int write_hints(struct dm_cache_metadata *cmd, struct dm_cache_policy *po
|
||||
(strlen(policy_name) > sizeof(cmd->policy_name) - 1))
|
||||
return -EINVAL;
|
||||
|
||||
strncpy(cmd->policy_name, policy_name, sizeof(cmd->policy_name));
|
||||
strscpy(cmd->policy_name, policy_name, sizeof(cmd->policy_name));
|
||||
memcpy(cmd->policy_version, policy_version, sizeof(cmd->policy_version));
|
||||
|
||||
hint_size = dm_cache_policy_get_hint_size(policy);
|
||||
|
Loading…
Reference in New Issue
Block a user