All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kees Cook <keescook@chromium.org>
To: Justin Stitt <justinstitt@google.com>
Cc: Rasesh Mody <rmody@marvell.com>,
	Sudarsana Kalluru <skalluru@marvell.com>,
	GR-Linux-NIC-Dev@marvell.com,
	"David S. Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-hardening@vger.kernel.org
Subject: Re: [PATCH] bna: replace deprecated strncpy with strscpy
Date: Thu, 5 Oct 2023 16:09:23 -0700	[thread overview]
Message-ID: <202310051549.D76C508541@keescook> (raw)
In-Reply-To: <20231005-strncpy-drivers-net-ethernet-brocade-bna-bfa_ioc-c-v1-1-8dfd30123afc@google.com>

On Thu, Oct 05, 2023 at 09:05:42PM +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.
> 
> bfa_ioc_get_adapter_manufacturer() simply copies a string literal into
> `manufacturer`.
> 
> NUL-padding is not needed because bfa_ioc_get_adapter_manufacturer()'s
> only caller passes `ad_attr` (which is from ioc_attr) which is then
> memset to 0.
>  bfa_nw_ioc_get_attr() ->
>    bfa_ioc_get_adapter_attr() ->
>      bfa_nw_ioc_get_attr() ->
>        memset((void *)ioc_attr, 0, sizeof(struct bfa_ioc_attr));
> 
> 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
> Cc: linux-hardening@vger.kernel.org
> Signed-off-by: Justin Stitt <justinstitt@google.com>
> ---
> Note: build-tested only.
> ---
>  drivers/net/ethernet/brocade/bna/bfa_ioc.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/brocade/bna/bfa_ioc.c b/drivers/net/ethernet/brocade/bna/bfa_ioc.c
> index b07522ac3e74..497cb65f2d06 100644
> --- a/drivers/net/ethernet/brocade/bna/bfa_ioc.c
> +++ b/drivers/net/ethernet/brocade/bna/bfa_ioc.c
> @@ -2839,7 +2839,7 @@ bfa_ioc_get_adapter_optrom_ver(struct bfa_ioc *ioc, char *optrom_ver)
>  static void
>  bfa_ioc_get_adapter_manufacturer(struct bfa_ioc *ioc, char *manufacturer)
>  {
> -	strncpy(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN);
> +	strscpy(manufacturer, BFA_MFG_NAME, sizeof(manufacturer));
>  }

tl;dr: please use:

	strscpy_pad(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN);

sizeof() will not work correctly here -- manufacturer is a char *,
so this will always be sizeof(unsigned long). Which begs the question,
why is an unbounded string being passed here? Yay fragile API.

I notice bfa_ioc_get_adapter_manufacturer() in drivers/scsi/bfa/bfa_ioc.c
does this:

        memset((void *)manufacturer, 0, BFA_ADAPTER_MFG_NAME_LEN);
        strscpy(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN);

So, I think we should follow suit (but use strscpy_pad() instead to
avoid the partially redundant memset).

I also note that the "manufacturer" argument comes from many possible
structs, not just struct bfa_adapter_attr:

drivers/net/ethernet/brocade/bna/bfa_ioc.c:2761:        bfa_ioc_get_adapter_manufacturer(ioc, ad_attr->manufacturer);

	struct bfa_adapter_attr {
	        char            manufacturer[BFA_ADAPTER_MFG_NAME_LEN];

drivers/scsi/bfa/bfa_ioc.c:2698:        bfa_ioc_get_adapter_manufacturer(ioc, ad_attr->manufacturer);

	struct bfa_adapter_attr_s {
	        char            manufacturer[BFA_ADAPTER_MFG_NAME_LEN];

drivers/scsi/bfa/bfa_fcs_lport.c:2630:  bfa_ioc_get_adapter_manufacturer(&port->fcs->bfa->ioc,

	struct bfa_fcs_fdmi_hba_attr_s {
		...
	        u8         manufacturer[64];

This is unexpectedly large... I was expecting either 8 or
BFA_ADAPTER_MFG_NAME_LEN:

drivers/net/ethernet/brocade/bna/bfa_defs.h:31: BFA_ADAPTER_MFG_NAME_LEN    = 8,   /*!< manufacturer name length */
drivers/scsi/bfa/bfa_defs.h:259:        BFA_ADAPTER_MFG_NAME_LEN    = 8,   /*  manufacturer name length */

(But it seems not a problem, since it's memset() before...)

And there are more that I've check, since I also found this macro:

#define bfa_get_adapter_manufacturer(__bfa, __manufacturer)             \
        bfa_ioc_get_adapter_manufacturer(&(__bfa)->ioc, __manufacturer)

And there are multiple implementations of bfa_ioc_get_adapter_manufacturer(), it seems.

-- 
Kees Cook

      reply	other threads:[~2023-10-05 23:09 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-10-05 21:05 [PATCH] bna: replace deprecated strncpy with strscpy Justin Stitt
2023-10-05 23:09 ` Kees Cook [this message]

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=202310051549.D76C508541@keescook \
    --to=keescook@chromium.org \
    --cc=GR-Linux-NIC-Dev@marvell.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=justinstitt@google.com \
    --cc=kuba@kernel.org \
    --cc=linux-hardening@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=rmody@marvell.com \
    --cc=skalluru@marvell.com \
    /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.