From: Marek Vasut <marex@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] drivers: usb: fsl: Fix NULL terminating issue for usb controller name string
Date: Fri, 17 Jun 2016 21:51:42 +0200 [thread overview]
Message-ID: <576454CE.30507@denx.de> (raw)
In-Reply-To: <HE1PR0401MB2028479B98217A52672B3F3CE3570@HE1PR0401MB2028.eurprd04.prod.outlook.com>
On 06/17/2016 06:24 AM, Rajesh Bhagat wrote:
>
>
>> -----Original Message-----
>> From: Marek Vasut [mailto:marex at denx.de]
>> Sent: Thursday, June 02, 2016 5:49 PM
>> To: Rajesh Bhagat <rajesh.bhagat@nxp.com>; u-boot at lists.denx.de
>> Cc: york sun <york.sun@nxp.com>; Sriram Dash <sriram.dash@nxp.com>
>> Subject: Re: [PATCH] drivers: usb: fsl: Fix NULL terminating issue for usb controller
>> name string
>>
>> On 06/02/2016 05:14 AM, Rajesh Bhagat wrote:
>>>
>>>
>>>> -----Original Message-----
>>>> From: Marek Vasut [mailto:marex at denx.de]
>>>> Sent: Thursday, June 02, 2016 1:38 AM
>>>> To: Rajesh Bhagat <rajesh.bhagat@nxp.com>; u-boot at lists.denx.de
>>>> Cc: york sun <york.sun@nxp.com>; Sriram Dash <sriram.dash@nxp.com>
>>>> Subject: Re: [PATCH] drivers: usb: fsl: Fix NULL terminating issue
>>>> for usb controller name string
>>>>
>>>> On 06/01/2016 04:55 PM, Rajesh Bhagat wrote:
>>>>>
>>>>>
>>>>>> -----Original Message-----
>>>>>> From: Marek Vasut [mailto:marex at denx.de]
>>>>>> Sent: Wednesday, June 01, 2016 6:51 PM
>>>>>> To: Rajesh Bhagat <rajesh.bhagat@nxp.com>; u-boot at lists.denx.de
>>>>>> Cc: york sun <york.sun@nxp.com>; Sriram Dash <sriram.dash@nxp.com>
>>>>>> Subject: Re: [PATCH] drivers: usb: fsl: Fix NULL terminating issue
>>>>>> for usb controller name string
>>>>>>
>>>>>> On 06/01/2016 01:17 PM, Rajesh Bhagat wrote:
>>>>>>> Fixes NULL terminating issue for usb controller name string and
>>>>>>> performs code cleanup for intializing variables
>>>>>>> current_usb_controller and usb_phy.
>>>>>>>
>>>>>>> Signed-off-by: Rajesh Bhagat <rajesh.bhagat@nxp.com>
>>>>>>> ---
>>>>>>> drivers/usb/host/ehci-fsl.c | 10 ++++------
>>>>>>> 1 files changed, 4 insertions(+), 6 deletions(-)
>>>>>>>
>>>>>>> diff --git a/drivers/usb/host/ehci-fsl.c
>>>>>>> b/drivers/usb/host/ehci-fsl.c index a43d37d..a806993 100644
>>>>>>> --- a/drivers/usb/host/ehci-fsl.c
>>>>>>> +++ b/drivers/usb/host/ehci-fsl.c
>>>>>>> @@ -49,11 +49,9 @@ int ehci_hcd_init(int index, enum usb_init_type init,
>>>>>>> struct usb_ehci *ehci = NULL;
>>>>>>> const char *phy_type = NULL;
>>>>>>> size_t len;
>>>>>>> - char current_usb_controller[5];
>>>>>>> + char current_usb_controller[5] = {0};
>>>>>>> #ifdef CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY
>>>>>>> - char usb_phy[5];
>>>>>>> -
>>>>>>> - usb_phy[0] = '\0';
>>>>>>> + char usb_phy[5] = {0};
>>>>>>> #endif
>>>>>>> if (has_erratum_a007075()) {
>>>>>>> /*
>>>>>>> @@ -64,8 +62,8 @@ int ehci_hcd_init(int index, enum usb_init_type init,
>>>>>>> */
>>>>>>> mdelay(5);
>>>>>>> }
>>>>>>> - memset(current_usb_controller, '\0', 5);
>>>>>>> - snprintf(current_usb_controller, 4, "usb%d", index+1);
>>>>>>> + snprintf(current_usb_controller, sizeof(current_usb_controller),
>>>>>>> + "usb%d", index+1);
>>>>>>
>>>>>> What is the actual problem here ? snprintf() will add the \0 at the
>>>>>> end of the string, so I don't see any "null terminating issue" in the code.
>>>>>> I can understand using the sizeof() in the snprintf(), which is valid, but that's
>> all.
>>>>>>
>>>>>
>>>>> Hello Marek,
>>>>>
>>>>> It is surprising for me too, but same can be verified even on x86
>>>>> machine using below test program, Can it be compiler optimization of memset?
>>>>
>>>> The man snprintf explains that:
>>>>
>>>> int snprintf(char *str, size_t size, const char *format, ...);
>>>>
>>>> The functions snprintf() and vsnprintf() write at most size
>>>> bytes (including the terminating null byte ('\0')) to str.
>>>
>>> Hello Marek,
>>>
>>> You are right, snprintf does add a terminating null byte. Let me share details of
>> issue faced:
>>>
>>> It indeed is not NULL terminating issue, as snprintf adds it. This
>>> issue is due to the length passed to snprintf is causing the data loss of the last byte:
>>>
>>> Current code: snprintf(current_usb_controller, 4, "usb%d", index+1);
>>> <==== 4 is passed Proposed code: snprintf(current_usb_controller,
>>> 5,"usb%d", index+1); i.e. sizeof(current_usb_controller) <== 5 is
>>> passed
>>>
>>> Current code is copying 4 bytes i.e. "usb1" and snprintf adds '\0' at
>>> 4th offset which causes the data loss and final data Becomes "usb".
>>> But proposed code is copying 5 bytes i.e. "usb1\0" and snprintf adds '\0' at 5th offset
>> and final data becomes "usb1" which is the expected output.
>
> Hello Marek,
>
>>
>> That's correct, thus you need to use the sizeof().
>>
>
> Are you planning to pick this up?
No, I expect a 1-liner V2 patch changing just the 4 to sizeof() in the
snprintf() argument. The rest of the patch is unrelated.
--
Best regards,
Marek Vasut
prev parent reply other threads:[~2016-06-17 19:51 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-01 11:17 [U-Boot] [PATCH] drivers: usb: fsl: Fix NULL terminating issue for usb controller name string Rajesh Bhagat
2016-06-01 13:20 ` Marek Vasut
2016-06-01 14:55 ` Rajesh Bhagat
2016-06-01 20:08 ` Marek Vasut
2016-06-02 3:14 ` Rajesh Bhagat
2016-06-02 12:18 ` Marek Vasut
2016-06-17 4:24 ` Rajesh Bhagat
2016-06-17 19:51 ` Marek Vasut [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=576454CE.30507@denx.de \
--to=marex@denx.de \
--cc=u-boot@lists.denx.de \
/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.