scsi: elx: libefc: Replace deprecated strncpy() with strscpy_pad()/memcpy()
authorJustin Stitt <justinstitt@google.com>
Thu, 26 Oct 2023 01:53:13 +0000 (01:53 +0000)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 15 Nov 2023 14:46:03 +0000 (09:46 -0500)
strncpy() is deprecated for use on NUL-terminated destination strings [1]
and as such we should prefer more robust and less ambiguous string
interfaces.

To keep node->current_state_name and node->prev_state_name NUL-padded and
NUL-terminated let's use strscpy_pad() as this implicitly provides both.

For the swap between the two, a simple memcpy() will suffice.

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
Cc: linux-hardening@vger.kernel.org
Signed-off-by: Justin Stitt <justinstitt@google.com>
Link: https://lore.kernel.org/r/20231026-strncpy-drivers-scsi-elx-libefc-efc_node-h-v2-1-5c083d0c13f4@google.com
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/elx/libefc/efc_node.h

index e9c600a..e575799 100644 (file)
@@ -26,13 +26,13 @@ efc_node_evt_set(struct efc_sm_ctx *ctx, enum efc_sm_event evt,
        struct efc_node *node = ctx->app;
 
        if (evt == EFC_EVT_ENTER) {
-               strncpy(node->current_state_name, handler,
-                       sizeof(node->current_state_name));
+               strscpy_pad(node->current_state_name, handler,
+                           sizeof(node->current_state_name));
        } else if (evt == EFC_EVT_EXIT) {
-               strncpy(node->prev_state_name, node->current_state_name,
-                       sizeof(node->prev_state_name));
-               strncpy(node->current_state_name, "invalid",
-                       sizeof(node->current_state_name));
+               memcpy(node->prev_state_name, node->current_state_name,
+                      sizeof(node->prev_state_name));
+               strscpy_pad(node->current_state_name, "invalid",
+                           sizeof(node->current_state_name));
        }
        node->prev_evt = node->current_evt;
        node->current_evt = evt;