[U-Boot] [PATCH v1] env: fix crash using default -f -a

Gerlando Falauto gerlando.falauto at keymile.com
Fri Oct 5 12:58:11 CEST 2012


Hi Stefano,

On 10/05/2012 12:41 PM, Stefano Babic wrote:
> On 05/10/2012 12:29, Gerlando Falauto wrote:
>> Hi Stefano,
>>
>
> Hi Gerlando,
>
>> thanks for reporting and providing a fix for this.
>> I'm very sorry for introducing this problem and for the late response.
>>
>> Please see my comments below.
>>
>> [As a side node, I couldn't really reproduce the issue neither on
>> PowerPC nor on ARM (though simple_strtoul should legitimately crash) as
>> apparently accessing NULL locations doesn't really bother our
>> architectures...]
>
> Right. For PowerPC, Address 0 is a valid address in memory and the
> system does not crash.

I didn't know that, thanks.

> However, I tested on a TI's ARM and address zero
> is not valid.
>
>>
>> On 10/04/2012 07:30 PM, Stefano Babic wrote:
>>> newval pointer is not checked before its usage,
>>> inside env_check_apply().
>>>
>>> Signed-off-by: Stefano Babic<sbabic at denx.de>
>>> CC: gerlando.falauto at keymile.com
>>> ---
>>>    common/cmd_nvedit.c |    6 +++---
>>>    1 file changed, 3 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c
>>> index 3474bc6..8144c85 100644
>>> --- a/common/cmd_nvedit.c
>>> +++ b/common/cmd_nvedit.c
>>> @@ -272,7 +272,7 @@ int env_check_apply(const char *name, const char
>>> *oldval,
>>>            /*
>>>             * Switch to new baudrate if new baudrate is supported
>>>             */
>>> -        if (strcmp(name, "baudrate") == 0) {
>>> +        if ((strcmp(name, "baudrate") == 0)&&   (newval != NULL)) {
>>
>> You're right in that the problem here is due to the function explicitly
>> being called with a NULL value.
>> My idea was to have "env default" perform some sort of cleanup before
>> assigning the actual values from the default environment (if any).
>
> I have seen, I have not fully understood. My idea is that, if someone
> want to restore the environment to the default values, no actions should
> be taken, else the "default" values cannot be really restored.

My idea here was to "apply" the changes as soon as the environment gets 
changed, like it would happen with a manual "setenv"/"env set".
So for instance, if you switch from a custom baudrate back to the 
default baudrate, you get a message prompting you to switch to the new 
baudrate (which actually *DOES* change on the console).

Whether that should also be performed as a "cleanup" action upon 
restoring defaults, well I am not sure...

>> So by adding these extra checks you're subtly canceling those efforts.
>
> That is correct, but in any case a check for a NULL pointer should be
> done before accessing to the pointer, independently what we want to do
> with it.

Absolutely. See my proposed patch.

>> So I would rather provide a default value to prevent the crashes,
>> instead of skipping settings altogether. Posting a patch in a few minutes.
>
> Ok, I will review it. In any case, we need a fix for the coming release.

Absolutely. Once again, I cannot apologize and thank you enough for 
reporting and digging into this.
I assumed providing an own patch would make more sense than asking you 
to review yours, not sure whether it is popular practice to do so.

>> Whether it's legitimate to perform these "cleanups", well that's of
>> course open for discussion.
>
> Indeed.
>
>> But I believe it doesn't make much sense to call a function and pass an
>> argument which is sort of guaranteed to have no effect whatsoever.
>
> Right. It is the same as calling the function with do_apply=0.

Right, but since the return value is also ignored, what's the point in 
calling it in the first place?

>>
>>>                int baudrate = simple_strtoul(newval, NULL, 10);
>>>                int i;
>>>                for (i = 0; i<   N_BAUDRATES; ++i) {
>>> @@ -308,12 +308,12 @@ int env_check_apply(const char *name, const char
>>> *oldval,
>>>         * Some variables should be updated when the corresponding
>>>         * entry in the environment is changed
>>>         */
>>> -    if (strcmp(name, "loadaddr") == 0) {
>>> +    if ((strcmp(name, "loadaddr") == 0)&&   (newval != NULL)) {
>>>            load_addr = simple_strtoul(newval, NULL, 16);
>>>            return 0;
>>>        }
>>>    #if defined(CONFIG_CMD_NET)
>>> -    else if (strcmp(name, "bootfile") == 0) {
>>> +    else if ((strcmp(name, "bootfile") == 0)&&   (newval != NULL)) {
>>>            copy_filename(BootFile, newval, sizeof(BootFile));
>>>            return 0;
>>>        }
>>
>
> Best regards,
> Stefano
>

Best regards,
Gerlando


More information about the U-Boot mailing list