[comp.sys.amiga] Bug in uupc

peter@sugar.UUCP (Peter da Silva) (08/25/87)

The following function, which seems to be an overly complex version
of fgetc(fp), has a serious bug in it. It's from "genv.c" in the Amiga
code for the uupc program.

Basically, line[256] has to be static. I find it hard to believe that
this code was ever tested... because there is no way line[] will remain
valid from invocation to invocation. In addition, the function is
entirely superfluous since it's identical in function to "fgetc()".

/*--------------------------------------------------------------*/
/*	getone: get next character file f.  f already open	*/
/*--------------------------------------------------------------*/

static int getone( f )
FILE *f;
{
   char c, line[256];
   static int pos = 0;
   static int len = 0;

   if ( ++pos > len || line[pos] == '\0' ) 
     {
	if ( fgets( line, 255, f ) == NULL )
	   return EOF;
	pos = 0;
	len = strlen( line );
     }

   c = line[pos];
   return c;
   
}
-- 
-- Peter da Silva `-_-' ...!seismo!soma!uhnix1!sugar!peter
--                  U   <--- not a copyrighted cartoon :->

mouse@mcgill-vision.UUCP (09/19/87)

In article <563@sugar.UUCP>, peter@sugar.UUCP (Peter da Silva) writes:
> The following [...] complex version of fgetc(fp) has a serious bug in
> it.  It's from "genv.c" in the Amiga code for the uupc program.

> Basically, line[256] has to be static.

Not only that: even if you do make it static, the function will break
badly if called with various different stdio streams, since if there is
something in its buffer it *ignores* its argument!  But it's all
academic because, as you point out, it

> ... is entirely superfluous since it's identical in function to
> "fgetc()".

					der Mouse

				(mouse@mcgill-vision.uucp)