Re: freopen() broken in Fedora 15

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Once upon a time, Chuck Forsberg WA7KGX N2469R <caf@xxxxxxxx> said:
> The standard IO freopen function stopped working on or about
> the time I installed 64 bit Fedora 15 on the omen.com server.
> 
> The attached program is derived from the 1977 Bill Joy version.
> It does not display any text when compiled and run under 64 bit
> F 15 clean install and updated as of today.
> 
> The workaround is to rewrite the program to eliminate the use
> of freopen.

The problem is that file descriptors and file streams are being mixed
(and without proper includes).

> #ifndef	lint
> static char *sccsid = "@(#)head.c	4.1 (Berkeley) 10/1/80";
> #endif
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <stdio.h>
> #include <string.h>
> #include <stdlib.h>

<snip>

> 			close(0);

close() is defined in unistd.h, not included above.  It operates on file
descriptors.

> 			if (freopen(argv[0], "r", stdin) == NULL) {

freopen() operates on file streams.  The underlying library routine will
allocate a file descriptor, but that is transparent to the caller.

Mixing access on descriptors and streams is bad and I believe undefined
behavior, especially closing a descriptor out from under a stream.  It
may have worked before, but that's not guaranteed by anything.

In any case, the close(0) is unnecessary, as the whole point of
freopen() is that it will close the existing stream (and internally-used
descriptor) as necessary (which may or may not be descriptor 0).

In short: the code you sent is broken - fix it.
-- 
Chris Adams <cmadams@xxxxxxxxxx>
Systems and Network Administrator - HiWAAY Internet Services
I don't speak for anybody but myself - that's enough trouble.
-- 
test mailing list
test@xxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe: 
https://admin.fedoraproject.org/mailman/listinfo/test


[Index of Archives]     [Fedora Desktop]     [Fedora SELinux]     [Photo Sharing]     [Yosemite Forum]     [KDE Users]

  Powered by Linux