On 06/17/2016 06:24 AM, Rajesh Bhagat wrote: > > >> -----Original Message----- >> From: Marek Vasut [mailto:ma...@denx.de] >> Sent: Thursday, June 02, 2016 5:49 PM >> To: Rajesh Bhagat <rajesh.bha...@nxp.com>; u-boot@lists.denx.de >> Cc: york sun <york....@nxp.com>; Sriram Dash <sriram.d...@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:ma...@denx.de] >>>> Sent: Thursday, June 02, 2016 1:38 AM >>>> To: Rajesh Bhagat <rajesh.bha...@nxp.com>; u-boot@lists.denx.de >>>> Cc: york sun <york....@nxp.com>; Sriram Dash <sriram.d...@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:ma...@denx.de] >>>>>> Sent: Wednesday, June 01, 2016 6:51 PM >>>>>> To: Rajesh Bhagat <rajesh.bha...@nxp.com>; u-boot@lists.denx.de >>>>>> Cc: york sun <york....@nxp.com>; Sriram Dash <sriram.d...@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.bha...@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 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot