All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vincent MAILHOL <mailhol.vincent@wanadoo.fr>
To: Andrew Lunn <andrew@lunn.ch>
Cc: linux-can@vger.kernel.org, Marc Kleine-Budde <mkl@pengutronix.de>,
	linux-kernel@vger.kernel.org,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	netdev@vger.kernel.org, linux-usb@vger.kernel.org,
	Saeed Mahameed <saeed@kernel.org>, Jiri Pirko <jiri@nvidia.com>,
	Lukas Magel <lukas.magel@posteo.net>
Subject: Re: [PATCH v4 3/6] can: etas_es58x: export product information through devlink_ops::info_get()
Date: Sun, 27 Nov 2022 13:31:17 +0900	[thread overview]
Message-ID: <CAMZ6Rq+-RH4QhBkdm_y60U1AaqEON5Mbii9N9p=zT_2AMY9gmw@mail.gmail.com> (raw)
In-Reply-To: <CAMZ6Rq+K+6gbaZ35SOJcR9qQaTJ7KR0jW=XoDKFkobjhj8CHhw@mail.gmail.com>

On Sun. 27 Nov. 2022 at 12:42, Vincent MAILHOL
<mailhol.vincent@wanadoo.fr> wrote:
> Hi Andrew,
>
> Thank you for the review and the interesting comments on the parsing.
>
> On. 27 Nov. 2022 at 02:37, Andrew Lunn <andrew@lunn.ch> wrote:
> > > +struct es58x_sw_version {
> > > +     u8 major;
> > > +     u8 minor;
> > > +     u8 revision;
> > > +};
> >
> > > +static int es58x_devlink_info_get(struct devlink *devlink,
> > > +                               struct devlink_info_req *req,
> > > +                               struct netlink_ext_ack *extack)
> > > +{
> > > +     struct es58x_device *es58x_dev = devlink_priv(devlink);
> > > +     struct es58x_sw_version *fw_ver = &es58x_dev->firmware_version;
> > > +     struct es58x_sw_version *bl_ver = &es58x_dev->bootloader_version;
> > > +     struct es58x_hw_revision *hw_rev = &es58x_dev->hardware_revision;
> > > +     char buf[max(sizeof("xx.xx.xx"), sizeof("axxx/xxx"))];
> > > +     int ret = 0;
> > > +
> > > +     if (es58x_sw_version_is_set(fw_ver)) {
> > > +             snprintf(buf, sizeof(buf), "%02u.%02u.%02u",
> > > +                      fw_ver->major, fw_ver->minor, fw_ver->revision);
> >
> > I see you have been very careful here, but i wonder if you might still
> > get some compiler/static code analyser warnings here. As far as i
> > remember %02u does not limit it to two characters.
>
> I checked, none of gcc and clang would trigger a warning even for a
> 'make W=12'. More generally speaking, I made sure that my driver is
> free of any W=12.
> (except from the annoying spam from GENMASK_INPUT_CHECK for which my
> attempts to silence it were rejected:
> https://lore.kernel.org/all/20220426161658.437466-1-mailhol.vincent@wanadoo.fr/
> ).
>
> > If the number is
> > bigger than 99, it will take three characters. And your types are u8,
> > so the compiler could consider these to be 3 characters each. So you
> > end up truncating. Which you look to of done correctly, but i wonder
> > if some over zealous checker will report it?
>
> That zealous check is named -Wformat-truncation in gcc (I did not find
> it in clang). Even W=3 doesn't report it so I consider this to be
> fine.
>
> > Maybe consider "xxx.xxx.xxx"?
>
> If I do that, I also need to consider the maximum length of the
> hardware revision would be "a/xxxxx/xxxxx" because the numbers are
> u16. The declaration would become:
>
>         char buf[max(sizeof("xxx.xxx.xxx"), sizeof("axxxxx/xxxxx"))];
>
> Because no such warning exists in the kernel, I do not think the above
> line to be a good trade off. I would like to keep things as they are,
> it is easier to read. That said, I will add an extra check in
> es58x_parse_sw_version() and es58x_parse_hw_revision() to assert that
> the number are not bigger than 99 for the software version (and not
> bigger than 999 for the hardware revision). That way the code will
> guarantee that the truncation can never occur.

Never mind. I forgot that I already accounted for that. The "%2u"
format in sscanf() will detect if the number is three or more digits.
So I am thinking of leaving everything as-is.

> > Nice paranoid code by the way. I'm not the best at spotting potential
> > buffer overflows, but this code looks good. The only question i had
> > left was how well sscanf() deals with UTF-8.
>
> It does not consider UTF-8. The %u is a _parse_integer_limit() in disguise.
>   https://elixir.bootlin.com/linux/v6.1-rc6/source/lib/vsprintf.c#L3637
>   https://elixir.bootlin.com/linux/v6.1-rc6/source/lib/vsprintf.c#L70
>
> _parse_integer_limit() just check for ASCII digits so the first UTF-8
> character would make the function return.
>   https://elixir.bootlin.com/linux/v6.1-rc6/source/lib/kstrtox.c#L65
>
> For example, this:
>   "FW:03.00.06"
> would fail parsing because sscanf() will not be able to match the
> first byte of the UTF-8 'F' with 'F'.
>
> Another example:
>   "FW:03.00.06"
> would also fail parsing because _parse_integer_limit() will not
> recognize the first byte of UTF-8 '0' as a valid ASCII digit and
> return early.
>
> To finish, a very edge case:
>   "FW:03.00.06"
> would incorrectly succeed. It will parse "FW:03.00.0" successfully and
> will return when encountering the UTF-8 '6'. But I am not willing to
> cover that edge case. If the device goes into this level of
> perversion, I do not care any more as long as it does not result in
> undefined behaviour.
>
>
> Yours sincerely,
> Vincent Mailhol

  reply	other threads:[~2022-11-27  4:31 UTC|newest]

Thread overview: 75+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-04  7:36 [PATCH] can: etas_es58x: report the firmware version through ethtool Vincent Mailhol
2022-11-04 11:52 ` Marc Kleine-Budde
2022-11-04 15:35   ` Vincent MAILHOL
2022-11-04 17:16 ` [PATCH v2 0/3] can: etas_es58x: report firmware version Vincent Mailhol
2022-11-04 17:16   ` [PATCH v2 1/3] USB: core: export usb_cache_string() Vincent Mailhol
2022-11-05  8:22     ` Greg Kroah-Hartman
2022-11-04 17:16   ` [PATCH v2 2/3] can: etas_es58x: use usb_cache_string() to retrieve the product info string Vincent Mailhol
2022-11-05  8:21     ` Greg Kroah-Hartman
2022-11-04 17:16   ` [PATCH v2 3/3] can: etas_es58x: report the firmware version through ethtool Vincent Mailhol
2022-11-05  8:23     ` Greg Kroah-Hartman
2022-11-05  9:27       ` Vincent MAILHOL
2022-11-05 17:21         ` Vincent MAILHOL
2022-11-05 17:38           ` Greg Kroah-Hartman
2022-11-06  0:45             ` Alan Stern
2022-11-06  5:34               ` Vincent MAILHOL
2022-11-06 11:21               ` Greg Kroah-Hartman
2022-11-06 12:47                 ` Vincent MAILHOL
2022-11-06 14:22                   ` Greg Kroah-Hartman
2022-11-06 14:44                     ` Vincent MAILHOL
2022-11-06 16:02                       ` Greg Kroah-Hartman
2022-11-12 15:40                         ` Vincent MAILHOL
2022-11-06 15:18                   ` Alan Stern
2022-11-13  4:01 ` [PATCH v3 0/3] can: etas_es58x: report firmware, bootloader and hardware version Vincent Mailhol
2022-11-13  4:01   ` [PATCH v3 1/3] USB: core: export usb_cache_string() Vincent Mailhol
2022-11-22 16:00     ` Greg Kroah-Hartman
2022-11-13  4:01   ` [PATCH v3 2/3] can: etas_es58x: export firmware, bootloader and hardware versions in sysfs Vincent Mailhol
2022-11-15 22:47     ` Saeed Mahameed
2022-11-16  0:36       ` Vincent MAILHOL
2022-11-16 23:20         ` Saeed Mahameed
2022-11-13  4:01   ` [PATCH v3 3/3] can: etas_es58x: report firmware-version through ethtool Vincent Mailhol
2022-11-13 16:48   ` [PATCH v3 0/3] can: etas_es58x: report firmware, bootloader and hardware version Andrew Lunn
2022-11-14 16:49     ` Vincent MAILHOL
2022-11-14 17:08       ` Andrew Lunn
2022-11-26 16:22 ` [PATCH v4 0/6] " Vincent Mailhol
2022-11-26 16:22   ` [PATCH v4 1/6] USB: core: export usb_cache_string() Vincent Mailhol
2022-11-26 16:22   ` [PATCH v4 2/6] can: etas_es58x: add devlink support Vincent Mailhol
2022-11-26 16:51     ` Andrew Lunn
2022-11-27  5:10       ` Vincent MAILHOL
2022-11-27 15:36         ` Alan Stern
2022-11-28  1:34           ` Vincent MAILHOL
2022-11-28  5:32             ` Vincent MAILHOL
2022-11-28 15:50               ` Alan Stern
2022-11-28 23:30                 ` Vincent MAILHOL
2022-11-28 13:42             ` Andrew Lunn
2022-11-28 14:29               ` Vincent MAILHOL
2022-11-26 16:22   ` [PATCH v4 3/6] can: etas_es58x: export product information through devlink_ops::info_get() Vincent Mailhol
2022-11-26 17:16     ` Andrew Lunn
2022-11-27  3:42       ` Vincent MAILHOL
2022-11-27  4:31         ` Vincent MAILHOL [this message]
2022-11-27 15:07         ` Andrew Lunn
2022-11-28  1:21           ` Vincent MAILHOL
2022-11-28 13:43             ` Andrew Lunn
2022-11-28 13:47     ` Andrew Lunn
2022-11-28 14:43       ` Vincent MAILHOL
2022-11-28 22:27         ` Jakub Kicinski
2022-11-28 23:17           ` Vincent MAILHOL
2022-11-26 16:22   ` [PATCH v4 4/6] can: etas_es58x: remove es58x_get_product_info() Vincent Mailhol
2022-11-28 13:44     ` Andrew Lunn
2022-11-28 14:36       ` Vincent MAILHOL
2022-11-26 16:22   ` [PATCH v4 5/6] can: etas_es58x: report the firmware version through ethtool Vincent Mailhol
2022-11-28 13:44     ` Andrew Lunn
2022-11-28 22:29     ` Jakub Kicinski
2022-11-29 17:12       ` Vincent MAILHOL
2022-11-30  2:31         ` Jakub Kicinski
2022-11-26 16:22   ` [PATCH v4 6/6] Documentation: devlink: add devlink documentation for the etas_es58x driver Vincent Mailhol
2022-11-30 17:46 ` [PATCH v5 0/7] can: etas_es58x: report firmware, bootloader and hardware version Vincent Mailhol
2022-11-30 17:46   ` [PATCH v5 1/7] can: etas_es58x: add devlink support Vincent Mailhol
2022-11-30 17:46   ` [PATCH v5 2/7] can: etas_es58x: add devlink port support Vincent Mailhol
2022-11-30 17:46   ` [PATCH v5 3/7] USB: core: export usb_cache_string() Vincent Mailhol
2022-11-30 17:46   ` [PATCH v5 4/7] net: devlink: add DEVLINK_INFO_VERSION_GENERIC_FW_BOOTLOADER Vincent Mailhol
2022-11-30 17:46   ` [PATCH v5 5/7] can: etas_es58x: export product information through devlink_ops::info_get() Vincent Mailhol
2022-11-30 17:46   ` [PATCH v5 6/7] can: etas_es58x: remove es58x_get_product_info() Vincent Mailhol
2022-11-30 17:46   ` [PATCH v5 7/7] Documentation: devlink: add devlink documentation for the etas_es58x driver Vincent Mailhol
2022-12-02 12:27     ` Marc Kleine-Budde
2022-12-02 13:15       ` Vincent MAILHOL

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='CAMZ6Rq+-RH4QhBkdm_y60U1AaqEON5Mbii9N9p=zT_2AMY9gmw@mail.gmail.com' \
    --to=mailhol.vincent@wanadoo.fr \
    --cc=andrew@lunn.ch \
    --cc=gregkh@linuxfoundation.org \
    --cc=jiri@nvidia.com \
    --cc=linux-can@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=lukas.magel@posteo.net \
    --cc=mkl@pengutronix.de \
    --cc=netdev@vger.kernel.org \
    --cc=saeed@kernel.org \
    /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.