diff mbox series

[v1,1/1] usb: hcd: Bump local buffer size in rh_string()

Message ID 20250116160543.216913-1-andriy.shevchenko@linux.intel.com (mailing list archive)
State Accepted
Commit 70cd0576aa39c55aabd227851cba0c601e811fb6
Headers show
Series [v1,1/1] usb: hcd: Bump local buffer size in rh_string() | expand

Commit Message

Andy Shevchenko Jan. 16, 2025, 4:05 p.m. UTC
GCC is not happy about the buffer size:

drivers/usb/core/hcd.c:441:48: error: ‘%s’ directive output may be truncated writing up to 64 bytes into a region of size between 35 and 99 [-Werror=format-truncation=]
  441 |                 snprintf (buf, sizeof buf, "%s %s %s", init_utsname()->sysname,
      |                                                ^~
  442 |                         init_utsname()->release, hcd->driver->description);
      |                         ~~~~~~~~~~~~~~~~~~~~~~~

Bump the size to get it enough for the possible strings.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/usb/core/hcd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Greg Kroah-Hartman Jan. 17, 2025, 6:11 a.m. UTC | #1
On Thu, Jan 16, 2025 at 06:05:43PM +0200, Andy Shevchenko wrote:
> GCC is not happy about the buffer size:
> 
> drivers/usb/core/hcd.c:441:48: error: ‘%s’ directive output may be truncated writing up to 64 bytes into a region of size between 35 and 99 [-Werror=format-truncation=]
>   441 |                 snprintf (buf, sizeof buf, "%s %s %s", init_utsname()->sysname,
>       |                                                ^~
>   442 |                         init_utsname()->release, hcd->driver->description);
>       |                         ~~~~~~~~~~~~~~~~~~~~~~~
> 
> Bump the size to get it enough for the possible strings.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
>  drivers/usb/core/hcd.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
> index 0b2490347b9f..a75cf1f6d741 100644
> --- a/drivers/usb/core/hcd.c
> +++ b/drivers/usb/core/hcd.c
> @@ -415,7 +415,7 @@ ascii2desc(char const *s, u8 *buf, unsigned len)
>  static unsigned
>  rh_string(int id, struct usb_hcd const *hcd, u8 *data, unsigned len)
>  {
> -	char buf[100];
> +	char buf[160];
>  	char const *s;
>  	static char const langids[4] = {4, USB_DT_STRING, 0x09, 0x04};

Worst case it's properly truncated so why do we need to worry about this
"warning"?  And what compiler version is giving that, I don't see that
here in my build testing.

thanks,

greg k-h
Andy Shevchenko Jan. 17, 2025, 1:42 p.m. UTC | #2
On Fri, Jan 17, 2025 at 07:11:46AM +0100, Greg Kroah-Hartman wrote:
> On Thu, Jan 16, 2025 at 06:05:43PM +0200, Andy Shevchenko wrote:
> > GCC is not happy about the buffer size:
> > 
> > drivers/usb/core/hcd.c:441:48: error: ‘%s’ directive output may be truncated writing up to 64 bytes into a region of size between 35 and 99 [-Werror=format-truncation=]
> >   441 |                 snprintf (buf, sizeof buf, "%s %s %s", init_utsname()->sysname,
> >       |                                                ^~
> >   442 |                         init_utsname()->release, hcd->driver->description);
> >       |                         ~~~~~~~~~~~~~~~~~~~~~~~
> > 
> > Bump the size to get it enough for the possible strings.

...

> >  static unsigned
> >  rh_string(int id, struct usb_hcd const *hcd, u8 *data, unsigned len)
> >  {
> > -	char buf[100];
> > +	char buf[160];
> >  	char const *s;
> >  	static char const langids[4] = {4, USB_DT_STRING, 0x09, 0x04};
> 
> Worst case it's properly truncated so why do we need to worry about this
> "warning"?

With CONFIG_WERROR=y it's a compilation error. My goal is to have
i386_defconfig and x86_64_defconfig to be compiled with `make W=1`.

> And what compiler version is giving that, I don't see that
> here in my build testing.

`make W=1` (and be sure that CONFIG_WERROR=y).

$ gcc --version
gcc (Debian 14.2.0-12) 14.2.0

(IIRC that had been started with any GCC from v13?)
Greg Kroah-Hartman Jan. 17, 2025, 2:26 p.m. UTC | #3
On Fri, Jan 17, 2025 at 03:42:27PM +0200, Andy Shevchenko wrote:
> On Fri, Jan 17, 2025 at 07:11:46AM +0100, Greg Kroah-Hartman wrote:
> > On Thu, Jan 16, 2025 at 06:05:43PM +0200, Andy Shevchenko wrote:
> > > GCC is not happy about the buffer size:
> > > 
> > > drivers/usb/core/hcd.c:441:48: error: ‘%s’ directive output may be truncated writing up to 64 bytes into a region of size between 35 and 99 [-Werror=format-truncation=]
> > >   441 |                 snprintf (buf, sizeof buf, "%s %s %s", init_utsname()->sysname,
> > >       |                                                ^~
> > >   442 |                         init_utsname()->release, hcd->driver->description);
> > >       |                         ~~~~~~~~~~~~~~~~~~~~~~~
> > > 
> > > Bump the size to get it enough for the possible strings.
> 
> ...
> 
> > >  static unsigned
> > >  rh_string(int id, struct usb_hcd const *hcd, u8 *data, unsigned len)
> > >  {
> > > -	char buf[100];
> > > +	char buf[160];
> > >  	char const *s;
> > >  	static char const langids[4] = {4, USB_DT_STRING, 0x09, 0x04};
> > 
> > Worst case it's properly truncated so why do we need to worry about this
> > "warning"?
> 
> With CONFIG_WERROR=y it's a compilation error. My goal is to have
> i386_defconfig and x86_64_defconfig to be compiled with `make W=1`.

So you have to have W=1 enabled, right?  On my normal builds, with
CONFIG_WERROR=y enabled, I do not see this.

> > And what compiler version is giving that, I don't see that
> > here in my build testing.
> 
> `make W=1` (and be sure that CONFIG_WERROR=y).

Ah, ok, manual work here.

And I guess the error is right, ->sysname could be 64 and release can
also be 64 bytes long, so it would be truncated.

thanks,

greg k-h
Andy Shevchenko Jan. 17, 2025, 2:33 p.m. UTC | #4
On Fri, Jan 17, 2025 at 03:26:13PM +0100, Greg Kroah-Hartman wrote:
> On Fri, Jan 17, 2025 at 03:42:27PM +0200, Andy Shevchenko wrote:
> > On Fri, Jan 17, 2025 at 07:11:46AM +0100, Greg Kroah-Hartman wrote:
> > > On Thu, Jan 16, 2025 at 06:05:43PM +0200, Andy Shevchenko wrote:
> > > > GCC is not happy about the buffer size:
> > > > 
> > > > drivers/usb/core/hcd.c:441:48: error: ‘%s’ directive output may be truncated writing up to 64 bytes into a region of size between 35 and 99 [-Werror=format-truncation=]
> > > >   441 |                 snprintf (buf, sizeof buf, "%s %s %s", init_utsname()->sysname,
> > > >       |                                                ^~
> > > >   442 |                         init_utsname()->release, hcd->driver->description);
> > > >       |                         ~~~~~~~~~~~~~~~~~~~~~~~
> > > > 
> > > > Bump the size to get it enough for the possible strings.

...

> > > >  static unsigned
> > > >  rh_string(int id, struct usb_hcd const *hcd, u8 *data, unsigned len)
> > > >  {
> > > > -	char buf[100];
> > > > +	char buf[160];
> > > >  	char const *s;
> > > >  	static char const langids[4] = {4, USB_DT_STRING, 0x09, 0x04};
> > > 
> > > Worst case it's properly truncated so why do we need to worry about this
> > > "warning"?
> > 
> > With CONFIG_WERROR=y it's a compilation error. My goal is to have
> > i386_defconfig and x86_64_defconfig to be compiled with `make W=1`.
> 
> So you have to have W=1 enabled, right?

Yep!

> On my normal builds, with CONFIG_WERROR=y enabled, I do not see this.
> 
> > > And what compiler version is giving that, I don't see that
> > > here in my build testing.
> > 
> > `make W=1` (and be sure that CONFIG_WERROR=y).
> 
> Ah, ok, manual work here.
> 
> And I guess the error is right, ->sysname could be 64 and release can
> also be 64 bytes long, so it would be truncated.

Yeah... Should I update the commit message and issue v2?
Greg Kroah-Hartman Jan. 17, 2025, 2:46 p.m. UTC | #5
On Fri, Jan 17, 2025 at 04:33:03PM +0200, Andy Shevchenko wrote:
> On Fri, Jan 17, 2025 at 03:26:13PM +0100, Greg Kroah-Hartman wrote:
> > On Fri, Jan 17, 2025 at 03:42:27PM +0200, Andy Shevchenko wrote:
> > > On Fri, Jan 17, 2025 at 07:11:46AM +0100, Greg Kroah-Hartman wrote:
> > > > On Thu, Jan 16, 2025 at 06:05:43PM +0200, Andy Shevchenko wrote:
> > > > > GCC is not happy about the buffer size:
> > > > > 
> > > > > drivers/usb/core/hcd.c:441:48: error: ‘%s’ directive output may be truncated writing up to 64 bytes into a region of size between 35 and 99 [-Werror=format-truncation=]
> > > > >   441 |                 snprintf (buf, sizeof buf, "%s %s %s", init_utsname()->sysname,
> > > > >       |                                                ^~
> > > > >   442 |                         init_utsname()->release, hcd->driver->description);
> > > > >       |                         ~~~~~~~~~~~~~~~~~~~~~~~
> > > > > 
> > > > > Bump the size to get it enough for the possible strings.
> 
> ...
> 
> > > > >  static unsigned
> > > > >  rh_string(int id, struct usb_hcd const *hcd, u8 *data, unsigned len)
> > > > >  {
> > > > > -	char buf[100];
> > > > > +	char buf[160];
> > > > >  	char const *s;
> > > > >  	static char const langids[4] = {4, USB_DT_STRING, 0x09, 0x04};
> > > > 
> > > > Worst case it's properly truncated so why do we need to worry about this
> > > > "warning"?
> > > 
> > > With CONFIG_WERROR=y it's a compilation error. My goal is to have
> > > i386_defconfig and x86_64_defconfig to be compiled with `make W=1`.
> > 
> > So you have to have W=1 enabled, right?
> 
> Yep!
> 
> > On my normal builds, with CONFIG_WERROR=y enabled, I do not see this.
> > 
> > > > And what compiler version is giving that, I don't see that
> > > > here in my build testing.
> > > 
> > > `make W=1` (and be sure that CONFIG_WERROR=y).
> > 
> > Ah, ok, manual work here.
> > 
> > And I guess the error is right, ->sysname could be 64 and release can
> > also be 64 bytes long, so it would be truncated.
> 
> Yeah... Should I update the commit message and issue v2?

No need, I've already take this as-is.
David Laight Jan. 17, 2025, 7:52 p.m. UTC | #6
On Thu, 16 Jan 2025 18:05:43 +0200
Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:

> GCC is not happy about the buffer size:
> 
> drivers/usb/core/hcd.c:441:48: error: ‘%s’ directive output may be truncated writing up to 64 bytes into a region of size between 35 and 99 [-Werror=format-truncation=]
>   441 |                 snprintf (buf, sizeof buf, "%s %s %s", init_utsname()->sysname,
>       |                                                ^~
>   442 |                         init_utsname()->release, hcd->driver->description);
>       |                         ~~~~~~~~~~~~~~~~~~~~~~~
> 
> Bump the size to get it enough for the possible strings.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
>  drivers/usb/core/hcd.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
> index 0b2490347b9f..a75cf1f6d741 100644
> --- a/drivers/usb/core/hcd.c
> +++ b/drivers/usb/core/hcd.c
> @@ -415,7 +415,7 @@ ascii2desc(char const *s, u8 *buf, unsigned len)
>  static unsigned
>  rh_string(int id, struct usb_hcd const *hcd, u8 *data, unsigned len)
>  {
> -	char buf[100];
> +	char buf[160];

Pretty pointless - look at ascii2desc() just above.
(Converts to LE i6-bit chars with a leading type+length.)
It gets truncated to 126 characters.
Indeed the entire snprintf() is pretty pointless given what happens to the
data given that it is all strings.

Is the overall truncation even right?
The outer length is bounded to 254, but there may be fewer characters in the
buffer because the buffer length itself might be smaller.
Seems a recipe for disaster.

	David 


>  	char const *s;
>  	static char const langids[4] = {4, USB_DT_STRING, 0x09, 0x04};
>
diff mbox series

Patch

diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 0b2490347b9f..a75cf1f6d741 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -415,7 +415,7 @@  ascii2desc(char const *s, u8 *buf, unsigned len)
 static unsigned
 rh_string(int id, struct usb_hcd const *hcd, u8 *data, unsigned len)
 {
-	char buf[100];
+	char buf[160];
 	char const *s;
 	static char const langids[4] = {4, USB_DT_STRING, 0x09, 0x04};