[Rpm-maint] [PATCH] build: fgetc returns int, not char.
Panu Matilainen
pmatilai at laiskiainen.org
Thu Aug 11 10:10:20 UTC 2016
On 08/10/2016 11:54 PM, Richard W.M. Jones wrote:
> On Wed, Aug 10, 2016 at 04:45:16PM -0400, Neal Gompa wrote:
>> On Wed, Aug 10, 2016 at 10:09 AM, Richard W.M. Jones <rjones at redhat.com> wrote:
>>> Returning the value into a char is a mistake on all platforms, but is
>>> particularly bad on RISC-V. On that platform (like ARM) char is
>>> unsigned. Therefore EOF (-1) is returned as 255, and the subsequent
>>> test 'c == EOF' ('255 == -1') fails causing an infinite loop.
>>>
>>> Signed-off-by: Richard W.M. Jones <rjones at redhat.com>
>>> ---
>>> build/parseSpec.c | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/build/parseSpec.c b/build/parseSpec.c
>>> index 85b0ba3..28f00bc 100644
>>> --- a/build/parseSpec.c
>>> +++ b/build/parseSpec.c
>>> @@ -323,7 +323,7 @@ retry:
>>>
>>> /* Make sure we have something in the read buffer */
>>> if (!(ofi->readPtr && *(ofi->readPtr))) {
>>> - char c;
>>> + int c;
>>> int i = 0;
>>>
>>> while((c = fgetc(ofi->fp)) != EOF) {
>>> --
>>> 2.7.4
>>>
>>
>> This patch looks good to me. Though, should we care about the size of
>> the integer?
>
> It's a good question. I would go with the man page definition of
> fgetc which just declares it an int:
>
> NAME
> fgetc, fgets, getc, getchar, ungetc - input of characters and strings
>
> SYNOPSIS
> #include <stdio.h>
>
> int fgetc(FILE *stream);
> ...
>
> The important thing here is that it can cope with all characters and
> the special EOF value (-1).
Yup. The patch looks correct to me.
For the brave, try compiling rpm with -Wconversion. I'd expect many of
the warnings to be "mostly harmless" for practical purposes but I'd also
be surprised if this were the only concrete bug lurking in there.
- Panu -
> Rich.
>
More information about the Rpm-maint
mailing list