From: Kees Cook <kees@kernel.org>
To: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Cc: Marc Kleine-Budde <mkl@pengutronix.de>,
linux-can@vger.kernel.org,
Thomas Kopp <thomas.kopp@microchip.com>,
Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>,
"Gustavo A . R . Silva" <gustavoars@kernel.org>,
netdev@vger.kernel.org, linux-hardening@vger.kernel.org
Subject: Re: [PATCH 2/2] can: mcp251xfd: decorate mcp251xfd_rx_ring.obj with __counted_by()
Date: Mon, 10 Jun 2024 11:44:22 -0700 [thread overview]
Message-ID: <202406101136.1AC33DD084@keescook> (raw)
In-Reply-To: <20240609045419.240265-3-mailhol.vincent@wanadoo.fr>
On Sun, Jun 09, 2024 at 01:54:19PM +0900, Vincent Mailhol wrote:
> A new __counted_by() attribute was introduced in [1]. It makes the
> compiler's sanitizer aware of the actual size of a flexible array
> member, allowing for additional runtime checks.
>
> Apply the __counted_by() attribute to the obj flexible array member of
> struct mcp251xfd_rx_ring.
>
> Note that the mcp251xfd_rx_ring.obj member is polymorphic: it can be
> either of:
>
> * an array of struct mcp251xfd_hw_rx_obj_can
> * an array of struct mcp251xfd_hw_rx_obj_canfd
>
> The canfd type was chosen in the declaration by the original author to
> reflect the upper bound. We pursue the same logic here: the sanitizer
> will only see the accurate size of canfd frames. For classical can
> frames, it will see a size bigger than the reality, making the check
> incorrect but silent (false negative).
>
> [1] commit dd06e72e68bc ("Compiler Attributes: Add __counted_by macro")
> Link: https://git.kernel.org/torvalds/c/dd06e72e68bc
>
> CC: Kees Cook <kees@kernel.org>
> Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
> ---
> drivers/net/can/spi/mcp251xfd/mcp251xfd.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd.h b/drivers/net/can/spi/mcp251xfd/mcp251xfd.h
> index 24510b3b8020..b7579fba9457 100644
> --- a/drivers/net/can/spi/mcp251xfd/mcp251xfd.h
> +++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd.h
> @@ -565,7 +565,7 @@ struct mcp251xfd_rx_ring {
> union mcp251xfd_write_reg_buf uinc_buf;
> union mcp251xfd_write_reg_buf uinc_irq_disable_buf;
> struct spi_transfer uinc_xfer[MCP251XFD_FIFO_DEPTH];
> - struct mcp251xfd_hw_rx_obj_canfd obj[];
> + struct mcp251xfd_hw_rx_obj_canfd obj[] __counted_by(obj_num);
> };
>
> struct __packed mcp251xfd_map_buf_nocrc {
This one seems safe:
rx_ring = kzalloc(sizeof(*rx_ring) + rx_obj_size * rx_obj_num,
GFP_KERNEL);
...
rx_ring->obj_num = rx_obj_num;
But I would like to see the above allocation math replaced with
struct_size() usage:
rx_ring = kzalloc(struct_size(rx_ring, obj, rx_obj_num), GFP_KERNEL);
But that leaves me with a question about the use of rx_obj_size in the
original code. Why is this a variable size? rx_ring has only struct
mcp251xfd_hw_rx_obj_canfd objects in the flexible array...
I suspect that struct mcp251xfd_rx_ring needs to actually be using a
union for its flexible array, but I can't find anything that is casting
struct mcp251xfd_rx_ring::obj to struct mcp251xfd_hw_rx_obj_can.
I'm worried about __counted_by getting used here if the flexible array
isn't actually the right type.
--
Kees Cook
prev parent reply other threads:[~2024-06-10 18:44 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-09 4:54 [PATCH 0/2] can: treewide: decorate flexible array members with __counted_by() Vincent Mailhol
2024-06-09 4:54 ` [PATCH 1/2] can: peak_canfd: decorate pciefd_board.can " Vincent Mailhol
2024-06-10 18:34 ` Kees Cook
2024-06-09 4:54 ` [PATCH 2/2] can: mcp251xfd: decorate mcp251xfd_rx_ring.obj " Vincent Mailhol
2024-06-10 18:44 ` 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=202406101136.1AC33DD084@keescook \
--to=kees@kernel.org \
--cc=gustavoars@kernel.org \
--cc=linux-can@vger.kernel.org \
--cc=linux-hardening@vger.kernel.org \
--cc=mailhol.vincent@wanadoo.fr \
--cc=manivannan.sadhasivam@linaro.org \
--cc=mkl@pengutronix.de \
--cc=netdev@vger.kernel.org \
--cc=thomas.kopp@microchip.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.