.
Last update: 1997-05-20
13210-92 #1,#14
Classification: duplicate request
These are duplicates of WG15 interpretation 9945-1-90 #23.
Refer to 9945-1-90 #23 for the response, published
in 1Q94.
_____________________________________________________________________________
Topic: fflush & EBADF
Relevant Sections: 8.1.11.1
Defect Report:
-----------------------
13210-92 #1
Assertion 6 of subclause 8.1.11.1 of ISO/IEC
13210:1994 states:
06(A) When the stream pointer argument addresses
a file descriptor that is closed, then a
call to fflush() returns a value of EOF and
sets errno to [EBADF].
Is this correct? The requirements for error
reporting for fflush() are in 8.2.3.11 of 9945-1-
1990:
If any of the functions above return an error
indication, the value of errno shall be set to
indicate the error condition. If that error
condition is one that this part of ISO/IEC 9945
specifies to be detected by one of the
corresponding underlying functions, the value of
errno shall be the same as the value specified
for the underlying function.
The C Standard says only this about error returns
from fflush():
The fflush function returns EOF if a write error
occurs, otherwise zero.
The C Standard does not specify when a write error
occurs. The unconditional requirement that
fflush() detect a bad file descriptor would seem
to go beyond the requirements of POSIX.1.
For example, if no data is present in the buffer
for the stream on which fflush() is called, it is
conforming for fflush() to return success without
making any attempt to access the file descriptor
associated with the stream. Since there is no
need to call write() (the underlying function for
fflush()) there is no guarantee that there will be
a write error.
My feeling is that an assertion that referred to
data in the buffer would be conforming:
06(C) If the implementation supports buffered
streams:
When the stream pointer argument addresses
a file descriptor that is closed and there
is data in the buffer for the stream
pointed to, then a call to fflush()
returns a value of EOF and sets errno to
[EBADF].
13210-92 #14:
The ISO/IEC 13210:1994 has the following assertion for
fflush():
06(A) When a stream pointer argument addresses a file descriptor
that is closed, then a call to fflush() returns a value of
EOF and sets errno to [EBADF].
The corresponding test in the NIST PCTS 151-2 beta test
suite has a test strategy as follows:
fd = Zopen(path, O_RDONLY | O_CREAT, PROT_ALL);
sfd = Zfdopen(fd, "r");
Zclose(fd);
expecting(EOF);
expecting(EBADF);
Zfflush(sfd);
The problem is the requirement that this strategy places
that fflush() return -1 in this case when we have a read
stream.
Rationale:
For write streams, fflush() has to be sure that any buffered
data is written. For read streams, fflush() has to discard
any buffer contents and adjust the current seek address.
For read/write streams, fflush() has to enable a change in
I/O direction. Given that in the above code fragment there
is no underlying operation to perform (there isn't even a
buffer, let alone any contents to ignore), there should not
be a requirement to return an EBADF error.
Only the C standard and 9945-1 own the rules for fflush().
There is no requirement that we can find in either that
corresponds to the above. Moreover, the above would require
adding an otherwise useless system call to fflush(). Think
about the precedent that this would set: Theoretically,
this would imply that, unless granted immunity, each stdio
function would have to do test-the-file- descriptor code
whenever it didn't happen to get to an underlying operation
that would do the verification already.
All the test assertions in 13210 are supposed to follow
directly from 9945-1 statements. The assertion quoted above
has no basis in POSIX.1. We recommend that this assertion
not apply to read streams.
WG15 response for 13210:1994
--------------------------------------------------
The interpretation for 9945-1-90 #23 applies to these
requests : 13210-92 #1, and 13210-92 #14.
Rationale for Interpretation:
-----------------------------
See 9945-1-90 #23.
_____________________________________________________________________________