[PATCH 1/1] mvebu: fix end-of-array check

Stefan Roese sr at denx.de
Mon Dec 5 12:42:44 CET 2022


Hi!

On 12/4/22 11:39, Pali Rohár wrote:
> Hello!
> 
> I would suggest to change description of the patch from
> 
>    "mvebu: fix end-of-array check"
> 
> to something like:
> 
>    "arm: mvebu: Espressobin: fix end-of-array check in env"
> 
> as it affects only Espressobin boards (not other mvebu).

Yes, please update the commit subject here.

> Stefan, please look below as this issue/fix is important.

Yes.

> On Wednesday 30 November 2022 13:33:40 Derek LaHousse wrote:
>> Properly seek the end of default_environment variables.
>>
>> The current algorithm overwrites from the second variable.  This
>> replacement finds the end of the array of strings.
>>
>> Stomped variables include "board", "soc", "loadaddr".  These can be
>> seen on a "env default -a" after patch, but they are not seen with a
>> version before the patch.
> 
> This is a real issue which I introduced in the past. So it some fix for
> this issue should be pulled into the v2023.01 release.

Understood.

>> Signed-off-by: Derek LaHousse <derek at seaofdirac.org>
>> ---
>>   board/Marvell/mvebu_armada-37xx/board.c | 7 +++++--
>>   1 file changed, 5 insertions(+), 2 deletions(-)
>>
>> diff --git a/board/Marvell/mvebu_armada-37xx/board.c
>> b/board/Marvell/mvebu_armada-37xx/board.c
>> index c6ecc323bb..ac29ac5b95 100644
>> --- a/board/Marvell/mvebu_armada-37xx/board.c
>> +++ b/board/Marvell/mvebu_armada-37xx/board.c
>> @@ -100,8 +100,11 @@ int board_late_init(void)
>>   		return 0;
>>   
>>   	/* Find free buffer in default_environment[] for new variables
>> */
>> -	while (*ptr != '\0' && *(ptr+1) != '\0') ptr++;
>> -	ptr += 2;
>> +	if (*ptr != '\0') { // Defending against empty default env
>> +		while ((i = strlen(ptr)) != 0) {
>> +			ptr += i + 1;
>> +		}
>> +	}
> 
> If I'm looking at the outer-if condition correctly then it is not
> needed. strlen("") returns zero and so inner-while loop stops
> immediately.
> 
> My proposed fix for this issue was just changing correct while loop
> check to ensure that ptr is set after the _last_ variable.
> 
> -	while (*ptr != '\0' && *(ptr+1) != '\0') ptr++;
> -	ptr += 2;
> +	while (*ptr != '\0' || *(ptr+1) != '\0') ptr++;
> +	ptr++;
> 
> Both changes should be equivalent, but I'm not sure which one is more
> readable. The original issue was introduced really by non-readable
> code...
> 
> Stefan, do you have a preference which one fix is better / more
> readable?

I would prefer to get Pali's corrected version included. Could you
please prepare a v2 patch with this update and also with the added
or changed patch subject.

> It would be really a good idea if you try to check if any of those
> proposed fixes/patches are now really correct.

Yes, please do.

Thanks,
Stefan


More information about the U-Boot mailing list