[PATCH 1/2] readline_simple: return -1 if getc fails

Ian Abbott abbotti at mev.co.uk
Tue Aug 8 09:05:35 PDT 2017


On 08/08/17 16:36, Lucas Stach wrote:
> Am Dienstag, den 08.08.2017, 11:20 -0400 schrieb Gaël PORTAY:
>> Hi Lucas,
>>
>> On Tue, Aug 08, 2017 at 09:51:54AM +0200, Lucas Stach wrote:
>>> Am Montag, den 07.08.2017, 18:10 -0400 schrieb Gaël PORTAY:
>>>> The getc function may return an errno code if an error happens.
>>>>
>>>> This patch prevents readline from printing a non printable character and
>>>> from looping to infinity and beyong.
>>>>
>>>> Signed-off-by: Gaël PORTAY <gael.portay at savoirfairelinux.com>
>>>> ---
>>>>   lib/readline_simple.c | 2 ++
>>>>   1 file changed, 2 insertions(+)
>>>>
>>>> diff --git a/lib/readline_simple.c b/lib/readline_simple.c
>>>> index c4d3d240e..1283c9602 100644
>>>> --- a/lib/readline_simple.c
>>>> +++ b/lib/readline_simple.c
>>>> @@ -58,6 +58,8 @@ int readline (const char *prompt, char *line, int len)
>>>>   
>>>>   	for (;;) {
>>>>   		c = getchar();
>>>> +		if (c < 0)
>>>> +			return (-1);
>>>
>>> I don't like made up error codes. Is there any reason why we couldn't
>>> just pass through the negative error code from getchar?
>>>
>>
>> The thing here is that getchar() may return an error, and that error is not
>> tested. This causes readline to print the character 0xea (-EINVAL) which is not
>> printable.
> 
> So why wouldn't the following fix the issue?
> 
> signed char c;

`int` would be better to allow non-ASCII characters.

> 
> if (c < 0)
> 	return c;

There are places where the return value is checked for `-1` for example 
in get_user_input() ("common/hush.c"), and in run_shell() 
("common/parser.c").

I think Gaël's patch is reasonable, although perhaps it should also set 
`line[0] = '\0';` before returning.

Off topic: there is another oddity in the the "simple" version of 
readline(). It ignores the `len` parameter and uses `CONFIG_CBSIZE` instead.

-- 
-=( Ian Abbott @ MEV Ltd.    E-mail: <abbotti at mev.co.uk> )=-
-=(                          Web: http://www.mev.co.uk/  )=-



More information about the barebox mailing list