[U-Boot] [PATCH 1/1] vsprintf.c: add EFI device path printing
Heinrich Schuchardt
xypron.glpk at gmx.de
Thu Nov 23 21:29:42 UTC 2017
On 11/21/2017 03:16 PM, Wolfgang Denk wrote:
> Dear Heinrich Schuchardt,
>
> In message <d643b22b-2511-9b40-772b-5f7f4486c289 at gmx.de> you wrote:
>>
>>>>>> + u16 *str = efi_dp_str((struct efi_device_path *)dp);
>>>>>> +
>>>>>> + buf = string16(buf, end, str, field_width, precision, flags);
>>>>>> + efi_free_pool(str);
>>>>>
>>>>> efi_dp_str() can return NULL. Should this not be handled?
>>>>
>>>> Thanks for reviewing.
>>>>
>>>> This situation is caught in string16:
>>>> u16 *str = s ? s : L"<NULL>";
>>>
>>> This is crash-preventing cosmetics, but no real error handling. I
>>> mean, should we not wave a big red flag and shout at the user: "Hey,
>>> your system is going berserk here!" ?
>>
>> Why do you think that the error handling should be in THIS function?
>
> It should be somewhere - but you cannot handle an error condition
> that you don't report to the caller.
>
> Instead of returning from the function with a clear error message
> and an error return code, you ignore it.
>
> The minimum action to take here would be that device_path_string()
> returns NULL when the error occurs, if there was a chance for the
> caller to handle that.
>
>> I can understand that we might improve error handling in the EFI coding
>> but I do not believe we should do it here.
>
> But if you don't even return an error code you have no chance to
> handle it elsewhere.
>
>>> Yes, and running out of memory at such a place is likely to be
>>> unrecoverable. So we should terminate all further processing baed on
>>> this result, and not continue with bogus data.
>>
>> printf() does not have any return value.
>
> This is incorrect. printf() is declared as
>
> int printf(const char *fmt, ...);
>
> as usual.
You are absolutely right. The C standard defines printf as returning a
negative number if an error arises.
Unfortunately the consumers of printf behave quite differently:
xasprintf(), PyString_FromFormat() correctly identify negative values as
an error.
set_config_filename, dbg_snprintf_key(), bootstage_mark_code() - to name
a few - will access illegal memory addresses.
As long as we cannot assure that each and every caller of a printf
function handles negative return values correctly the only safe handling
of errors is to return 0 or panic().
>
>> So here we could only panic().
>>
>> Is this really what you have in mind?
>
> Well, which other options do you see when you run out of memory?
> I can't see how you could recover from this, so if you don't abort
> here with a clear error message you will either do the same
> elsewhere (with a misleading error, as the actual problem happened
> eventually long before), or you will just crash, or run into
> undefined behaviour.
So I will resend the patch with panic().
Best regards
Heinrich
>
> Ignoring error condistions is always a Bad thing (TM).
>
> Best regards,
>
> Wolfgang Denk
>
More information about the U-Boot
mailing list