[PATCH 0/3] cmd: setexpr: add fmt format string operation

Roland Gaudig (OSS) roland.gaudig-oss at weidmueller.com
Tue Jun 29 11:41:25 CEST 2021


Hello Wolfgang

On 29.06.21 08:37, Wolfgang Denk wrote:
>
> In message <20210628151750.572837-1-roland.gaudig-oss at weidmueller.com> you wrote:
>>
>>
>> U-Boot uses almost everywhere hexadecimal numbers. But some bootargs
>> passed to Linux are expecting decimal numbers. As long as the values
>> are in the range 0 to 9 it is sufficient to just strip 0x from the
>> number. But for greater values a method for converting numbers to
>> decimal is needed.
>>
>> This patch adds C like format string capabilities to the setexpr
>> command. Here are some examples:
> 
> Thanks!
> 
>> In contrast to the original C format strings the number of parameters
>> is limited to one. As the get_arg() function returns unsigned long
>> type, the format string commands are limited to those which are
>> operating on unsigned long type.
> 
> These are two pretty unfortunate restrictions.  I guess it should
> not be too hard to avoid both of these.  Can you please give it a
> try?

I think it is possible to allow more than one format parameter or more
types. But it would make checking much more difficult.

> I think it is reasonable to assume (and specify) that, when the
> "fmt" option is used, _all_ following arguments will be passed
> (unchanged) to the sprintf() function.

I think just passing the format string directly to sprintf should be
avoided because it is unsafe. For example

=> setexpr foo fmt %s 0xffffffff

would surely lead to access on memory location outside the variable
where 0xffffffff is stored.

> This was actually one of my intentions when making this suggestion -
> to be able to construct any kind of data from pieces; say, for
> example:
> 
> => setexpr foo fmt "%0x08x-%s-%d-%s" $a $b $c $d

I think the only way to support such expressions in a save way would
be implementing an own format string parser for setexpr with
corresponding checks if access is possible, instead of just directly
passing all values unchecked to sprintf.
 
Best regards,
Roland Gaudig


More information about the U-Boot mailing list