From: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
To: Marc Kleine-Budde <mkl@pengutronix.de>, linux-can@vger.kernel.org
Cc: 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,
Vincent Mailhol <mailhol.vincent@wanadoo.fr>,
Kees Cook <kees@kernel.org>
Subject: [PATCH 0/2] can: treewide: decorate flexible array members with __counted_by()
Date: Sun, 9 Jun 2024 13:54:17 +0900 [thread overview]
Message-ID: <20240609045419.240265-1-mailhol.vincent@wanadoo.fr> (raw)
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.
I went through the full can subtree:
* drivers/net/can
* include/linux/can
* include/uapi/linux/can
* net/can
to try to identify the flexible array members that would benefit from
this attribute.
The observation is there are not so many flexible array member in the
can subtree to begin with.
Within the few flexible array members, only a two can benefit from the
__counted_by() without complex code refactoring, namely:
* patch 1/2: struct pciefd_board from
drivers/net/can/peak_canfd/peak_pciefd_main.c
* patch 2/2: struct mcp251xfd_rx_ring from
drivers/net/can/spi/mcp251xfd/mcp251xfd.h
Below is an exhaustive list of all the candidates for which
__counted_by() could not be applied to. If something did not appear
here, it just mean that I failed to catch it during my analysis.
* All the flexible array members which rely on the
DECLARE_FLEX_ARRAY() helper macro are out of scope for the
moment. Those will be reconsidered depending on the output of the
discussion in [2].
* struct bcm_msg_head from include/uapi/linux/can/bcm.h is a special
case. The bcm_msg_head.frames member is polymorphic: it can be
either of:
* an array of struct can_frame
* an array of struct canfd_frame
As of now, it is declared as struct can_frame for historical
reasons. An idea is to change the type to struct canfd_frame in
order to reflect the upper bound, in a similar fashion as struct
mcp251xfd_rx_ring (c.f. second patch from the series). Except
that this structure is from the uapi, meaning that such a change
will likely break the userland, making this a bad idea.
* struct can_skb_priv from include/linux/can/skb.h does not have a
count member.
* struct pucan_tx_msg and struct pucan_rx_msg from
include/linux/can/dev/peak_canfd.h both have a flexible array
member d, but it is counted by the four most significant bits of
the channel_dlc member. However __counted_by() does not accept a
shift logic. Because the layout of this structure is dictated by
the device API, refactor is impossible here.
* struct kvaser_usb_net_priv from
drivers/net/can/usb/kvaser_usb/kvaser_usb.h has the
active_tx_contexts member but it does not represent an array
boundary. Under normal conditions, the driver may write beyond
kvaser_usb_net_priv.tx_contexts[kvaser_usb_net_priv.active_tx_contexts].
Code refactoring may be considered here.
* Finally, struct flexcan_mb from
drivers/net/can/flexcan/flexcan-core.c and struct pciefd_rx_dma
from drivers/net/can/peak_canfd/peak_pciefd_main.c do not have
members to indicate the count. Because the layout of these
structures is dictated by the device API, refactor is impossible
here.
[1] commit dd06e72e68bc ("Compiler Attributes: Add __counted_by macro")
Link: https://git.kernel.org/torvalds/c/dd06e72e68bc
[2] stddef: Allow attributes to be used when creating flex arrays
Link: https://lore.kernel.org/all/20240213234023.it.219-kees@kernel.org/T/#u
CC: Kees Cook <kees@kernel.org>
Vincent Mailhol (2):
can: peak_canfd: decorate pciefd_board.can with __counted_by()
can: mcp251xfd: decorate mcp251xfd_rx_ring.obj with __counted_by()
drivers/net/can/peak_canfd/peak_pciefd_main.c | 6 ++++--
drivers/net/can/spi/mcp251xfd/mcp251xfd.h | 2 +-
2 files changed, 5 insertions(+), 3 deletions(-)
--
2.43.0
next reply other threads:[~2024-06-09 4:54 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-09 4:54 Vincent Mailhol [this message]
2024-06-09 4:54 ` [PATCH 1/2] can: peak_canfd: decorate pciefd_board.can with __counted_by() 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
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=20240609045419.240265-1-mailhol.vincent@wanadoo.fr \
--to=mailhol.vincent@wanadoo.fr \
--cc=gustavoars@kernel.org \
--cc=kees@kernel.org \
--cc=linux-can@vger.kernel.org \
--cc=linux-hardening@vger.kernel.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox