This is the mail archive of the
glibc-bugs@sourceware.org
mailing list for the glibc project.
[Bug libc/12724] New: fclose violates POSIX 2008 on seekable input streams
- From: "eblake at redhat dot com" <sourceware-bugzilla at sourceware dot org>
- To: glibc-bugs at sources dot redhat dot com
- Date: Mon, 2 May 2011 20:21:02 +0000
- Subject: [Bug libc/12724] New: fclose violates POSIX 2008 on seekable input streams
- Auto-submitted: auto-generated
http://sourceware.org/bugzilla/show_bug.cgi?id=12724
Summary: fclose violates POSIX 2008 on seekable input streams
Product: glibc
Version: 2.13
Status: NEW
Severity: normal
Priority: P2
Component: libc
AssignedTo: drepper.fsp@gmail.com
ReportedBy: eblake@redhat.com
POSIX 2008 states:
"If the file is not already at EOF, and the file is one capable of seeking, the
file offset of the underlying open file description shall be adjusted so that
the next operation on the open file description deals with the byte after the
last one read from or written to the stream being closed."
[XSH fclose,
http://pubs.opengroup.org/onlinepubs/9699919799/functions/fclose.html]
However, this sample program proves that for seekable input streams, glibc is
violating this requirement. The same program runs to completion on Solaris 10.
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#define NAME "test-fclose.t"
int
main (void)
{
const char buf[] = "hello world";
int fd;
int fd2;
FILE *f;
/* Prepare a seekable file. */
fd = open (NAME, O_RDWR | O_CREAT | O_TRUNC, 0600);
assert (0 <= fd);
assert (write (fd, buf, sizeof buf) == sizeof buf);
assert (lseek (fd, 1, SEEK_SET) == 1);
/* Create an output stream visiting the file; when it is closed, all
other file descriptors visiting the file must see the new file
position. */
fd2 = dup (fd);
assert (0 <= fd2);
f = fdopen (fd2, "w");
assert (f);
assert (fputc (buf[1], f) == buf[1]);
assert (fclose (f) == 0);
errno = 0;
assert (lseek (fd2, 0, SEEK_CUR) == -1);
assert (errno == EBADF);
assert (lseek (fd, 0, SEEK_CUR) == 2);
/* Likewise for an input stream. */
fd2 = dup (fd);
assert (0 <= fd2);
f = fdopen (fd2, "r");
assert (f);
assert (fgetc (f) == buf[2]);
assert (fclose (f) == 0);
errno = 0;
assert (lseek (fd2, 0, SEEK_CUR) == -1);
assert (errno == EBADF);
assert (lseek (fd, 0, SEEK_CUR) == 3);
/* Clean up. */
assert (remove (NAME) == 0);
return 0;
}
--
Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.