All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kees Cook <keescook@chromium.org>
To: Justin Stitt <justinstitt@google.com>
Cc: James Smart <james.smart@broadcom.com>,
	Keith Busch <kbusch@kernel.org>, Jens Axboe <axboe@kernel.dk>,
	Christoph Hellwig <hch@lst.de>, Sagi Grimberg <sagi@grimberg.me>,
	linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org,
	linux-hardening@vger.kernel.org
Subject: Re: [PATCH] nvme-fc: replace deprecated strncpy with strscpy
Date: Thu, 19 Oct 2023 16:20:28 -0700	[thread overview]
Message-ID: <202310191619.6BE8E38@keescook> (raw)
In-Reply-To: <20231019-strncpy-drivers-nvme-host-fc-c-v1-1-5805c15e4b49@google.com>

On Thu, Oct 19, 2023 at 09:34:35PM +0000, Justin Stitt wrote:
> strncpy() is deprecated for use on NUL-terminated destination strings
> [1] and as such we should prefer more robust and less ambiguous string
> interfaces.
> 
> Let's instead use strscpy() [2] as it guarantees NUL-termination on the
> destination buffer.
> 
> Moreover, there is no need to use:
> 
> |       min(FCNVME_ASSOC_HOSTNQN_LEN, NVMF_NQN_SIZE));
> 
> I imagine this was originally done to make sure the destination buffer
> is NUL-terminated by ensuring we copy a number of bytes less than the
> size of our destination, thus leaving some NUL-bytes at the end.

Yeah, this is odd, but I agree that the resulting strscpy does the
intended copy, since we've seen that other nqn strings are expected to
be %NUL terminated.

> 
> However, with strscpy(), we no longer need to do this and we can instead
> opt for the more idiomatic strscpy() usage of:
> 
> | strscpy(dest, src, sizeof(dest))
> 
> Also, no NUL-padding is required as lsop is zero-allocated:
> 
> |       lsop = kzalloc((sizeof(*lsop) +
> |                        sizeof(*assoc_rqst) + sizeof(*assoc_acc) +
> |                        ctrl->lport->ops->lsrqst_priv_sz), GFP_KERNEL);
> 
> ... and assoc_rqst points to a field in lsop:
> 
> |       assoc_rqst = (struct fcnvme_ls_cr_assoc_rqst *)&lsop[1];
> 
> Therefore, any additional NUL-byte assignments (like the ones that
> strncpy() makes) are redundant.
> 
> 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
> Cc: linux-hardening@vger.kernel.org
> Signed-off-by: Justin Stitt <justinstitt@google.com>
> Similar-to: https://lore.kernel.org/all/20231018-strncpy-drivers-nvme-host-fabrics-c-v1-1-b6677df40a35@google.com/

Reviewed-by: Kees Cook <keescook@chromium.org>

-- 
Kees Cook

  reply	other threads:[~2023-10-19 23:20 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-10-19 21:34 [PATCH] nvme-fc: replace deprecated strncpy with strscpy Justin Stitt
2023-10-19 23:20 ` Kees Cook [this message]
2023-11-30 22:01 ` Kees Cook

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202310191619.6BE8E38@keescook \
    --to=keescook@chromium.org \
    --cc=axboe@kernel.dk \
    --cc=hch@lst.de \
    --cc=james.smart@broadcom.com \
    --cc=justinstitt@google.com \
    --cc=kbusch@kernel.org \
    --cc=linux-hardening@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nvme@lists.infradead.org \
    --cc=sagi@grimberg.me \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.