Bug in isatty (all systems!)

Steven Bellovin smb at ulysses.UUCP
Thu Jul 11 22:00:27 AEST 1985


> > The following short C program
> > 
> > main(){
> > 	extern int errno;
> > 
> > 	errno = 0;
> > 	putchar('\n');
> > 	if(errno > 0)
> > 		perror("perror");
> > }
> > 
> > gives unexpected results.
> > The reason is that putchar calls putc calls _flsbuf calls isatty
> > and isatty contains the code
> > 	if(ioctl(f,TIOCGETP,&ttyb)<0)
> > 		return(0);
> 
> (which sets errno=25: not a typewriter unless stdout is /dev/tty)
> 
> I was going to post this one myself.  I found it on BSD 4.2, 
> System V/2.0 and UTX-32 (a Gould BSD + V port).  It really
> screwed me up bad.
> 
> The other 'gotcha' (same systems) is mktemp, which attempts
> to build a unique file name.  errno is always 2 (file not
> found) after successfully calling mktemp on these 3 systems.

The manual warns you that errno is not cleared on successful calls, so you're
not allowed to check it unless you've gotten an error return -- say, a
-1 from a system call.  With stdio, use ferror() to detect problems.



More information about the Comp.bugs.4bsd.ucb-fixes mailing list