[Rpm-maint] [PATCH] build: fgetc returns int, not char.

Richard W.M. Jones rjones at redhat.com
Wed Aug 10 20:54:28 UTC 2016


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).

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW


More information about the Rpm-maint mailing list