[U-Boot] Patch: Fix device enumeration through API.

Tim Kientzle kientzle at freebsd.org
Tue Mar 27 04:46:25 CEST 2012


Hello, Anatolij,

Thank you for your response.  Modified patch below:


On Mar 26, 2012, at 4:06 AM, Anatolij Gustschin wrote:

> Hi Tim,
> 
> Thanks for the patch. Please see some comments below.
> 
> On Tue, 21 Feb 2012 22:34:35 -0800
> Tim Kientzle <kientzle at freebsd.org> wrote:
> 
>> The one-line patch below fixes device enumeration through the
>> U-Boot API.
>> 
>> Device enumeration crashes when the system in question doesn't
>> have any RAM mapped to address zero (I discovered this on a
>> BeagleBone board), since the enumeration calls get_dev with a
>> NULL ifname sometimes which then gets passed down to strncmp().
>> 
>> This fix simply ensures that get_dev returns NULL when invoked
>> with a NULL ifname.
>> 
>> This could also be fixed by reworking the device enumeration to
>> never call get_dev with a NULL argument, but that's a much more
>> extensive change.  (get_dev is called from several places and the
>> code is driven by a list that's constructed in a way that naturally
>> leaves lots of NULLs.)
>> 
>> Cheers,
>> 
>> Tim Kientzle
>> 
>> diff --git a/disk/part.c b/disk/part.c
>> index f07a17f..1a82539 100644
>> --- a/disk/part.c
>> +++ b/disk/part.c
>> @@ -84,7 +84,7 @@ block_dev_desc_t *get_dev(char* ifname, int dev)
>> #ifdef CONFIG_NEEDS_MANUAL_RELOC
>> 	name += gd->reloc_off;
>> #endif
>> -	while (drvr->name) {
>> +	while (ifname && drvr->name) {
>> 		name = drvr->name;
>> 		reloc_get_dev = drvr->get_dev;
> 
> I would prefer just checking for ifname == NULL at the top
> of the function and not on each loop iteration. Also please
> add your Signed-off-by when submitting patches.


Signed-off-by: Tim Kientzle <kientzle at freebsd.org>

diff --git a/disk/part.c b/disk/part.c
index f07a17f..35a2def 100644
--- a/disk/part.c
+++ b/disk/part.c
@@ -80,6 +80,9 @@ block_dev_desc_t *get_dev(char* ifname, int dev)
        block_dev_desc_t* (*reloc_get_dev)(int dev);
        char *name;
 
+       if (ifname == NULL)
+               return NULL;
+
        name = drvr->name;
 #ifdef CONFIG_NEEDS_MANUAL_RELOC
        name += gd->reloc_off;



More information about the U-Boot mailing list