All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jacob Keller <jacob.e.keller@intel.com>
To: Jakub Kicinski <kuba@kernel.org>, <davem@davemloft.net>
Cc: <netdev@vger.kernel.org>, <edumazet@google.com>,
	<pabeni@redhat.com>, <andrew+netdev@lunn.ch>, <horms@kernel.org>,
	Alexander Duyck <alexanderduyck@fb.com>, <lee@trager.us>
Subject: Re: [PATCH net-next] eth: fbnic: fix ubsan complaints about OOB accesses
Date: Wed, 9 Jul 2025 14:23:11 -0700	[thread overview]
Message-ID: <bfb5122f-e603-457c-8115-4c4acfe7360b@intel.com> (raw)
In-Reply-To: <20250709205910.3107691-1-kuba@kernel.org>


[-- Attachment #1.1: Type: text/plain, Size: 2848 bytes --]



On 7/9/2025 1:59 PM, Jakub Kicinski wrote:
> UBSAN complains that we reach beyond the end of the log entry:
> 
>    UBSAN: array-index-out-of-bounds in drivers/net/ethernet/meta/fbnic/fbnic_fw_log.c:94:50
>    index 71 is out of range for type 'char [*]'
>    Call Trace:
>     <TASK>
>     ubsan_epilogue+0x5/0x2b
>     fbnic_fw_log_write+0x120/0x960
>     fbnic_fw_parse_logs+0x161/0x210
> 
> We're just taking the address of the character after the array,
> so this really seems like something that should be legal.
> But whatever, easy enough to silence by doing direct pointer math.
> 

My guess is because you're pointing the next entry at a pointer
generated from the address of a flexible array marked with __counted_by.
UBSAN assumes the array value ends at the end of the flexible array.. it
has no context that this is really a larger buffer.

> Fixes: c2b93d6beca8 ("eth: fbnic: Create ring buffer for firmware logs")
> Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>
> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
> ---
> CC: alexanderduyck@fb.com
> CC: jacob.e.keller@intel.com
> CC: lee@trager.us
> ---
>  drivers/net/ethernet/meta/fbnic/fbnic_fw_log.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_fw_log.c b/drivers/net/ethernet/meta/fbnic/fbnic_fw_log.c
> index 38749d47cee6..c1663f042245 100644
> --- a/drivers/net/ethernet/meta/fbnic/fbnic_fw_log.c
> +++ b/drivers/net/ethernet/meta/fbnic/fbnic_fw_log.c
> @@ -91,16 +91,16 @@ int fbnic_fw_log_write(struct fbnic_dev *fbd, u64 index, u32 timestamp,
>  		entry = log->data_start;
>  	} else {
>  		head = list_first_entry(&log->entries, typeof(*head), list);
> -		entry = (struct fbnic_fw_log_entry *)&head->msg[head->len + 1]; 

I am guessing that UBSAN gets info about the hint for the length of the
msg, via the counted_by annotation in the structure? Then it realizes
that this is too large. Strictly taking address of a value doesn't
actually directly access the memory... However, you then later access
the value via the entry variable.. Perhaps UBSAN is complaining about that?

> -		entry = PTR_ALIGN(entry, 8);
> +		entry_end = head->msg + head->len + 1;
> +		entry = PTR_ALIGN(entry_end, 8);
>  	}

Regardless, this replacement looks correct. And if it makes the UBSAN
happy, thats good.

Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>

>  
> -	entry_end = &entry->msg[msg_len + 1];
> +	entry_end = entry->msg + msg_len + 1;
>  
>  	/* We've reached the end of the buffer, wrap around */
>  	if (entry_end > log->data_end) {
>  		entry = log->data_start;
> -		entry_end = &entry->msg[msg_len + 1];
> +		entry_end = entry->msg + msg_len + 1;
>  	}
>  
>  	/* Make room for entry by removing from tail. */



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 236 bytes --]

  reply	other threads:[~2025-07-09 21:24 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-07-09 20:59 [PATCH net-next] eth: fbnic: fix ubsan complaints about OOB accesses Jakub Kicinski
2025-07-09 21:23 ` Jacob Keller [this message]
2025-07-10  0:11   ` Jakub Kicinski
2025-07-10 15:49     ` Jacob Keller
2025-07-11 23:10 ` patchwork-bot+netdevbpf

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=bfb5122f-e603-457c-8115-4c4acfe7360b@intel.com \
    --to=jacob.e.keller@intel.com \
    --cc=alexanderduyck@fb.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=horms@kernel.org \
    --cc=kuba@kernel.org \
    --cc=lee@trager.us \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.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.