Document rules for mixing stdio streams and file descriptors (RHEL-46724)

Resolves: RHEL-46724
This commit is contained in:
Florian Weimer 2024-11-07 09:39:00 +01:00
parent c711e702dd
commit c6a316c547
2 changed files with 75 additions and 1 deletions

70
glibc-RHEL-46724.patch Normal file
View File

@ -0,0 +1,70 @@
commit 7fe1fde499507126f7de10ebf12fecaf77ae6602
Author: Joseph Myers <josmyers@redhat.com>
Date: Mon Oct 28 22:22:26 2024 +0000
Document further requirement on mixing streams / file descriptors
The gilbc manual has some documentation in llio.texi of requirements
for moving between I/O on FILE * streams and file descriptors on the
same open file description.
The documentation of what must be done on a FILE * stream to move from
it to either a file descriptor or another FILE * for the same open
file description seems to match POSIX. However, there is an
additional requirement in POSIX on the *second* of the two handles
being moved between, which is not mentioned in the glibc manual: "If
any previous active handle has been used by a function that explicitly
changed the file offset, except as required above for the first
handle, the application shall perform an lseek() or fseek() (as
appropriate to the type of handle) to an appropriate location.".
Document this requirement on seeking in the glibc manual, limited to
the case that seems relevant to glibc (the new channel is a previously
active stream, on which the seeking previously occurred). Note that
I'm not sure what the "except as required above for the first handle"
is meant to be about, so I haven't documented anything for it. As far
as I can tell, nothing specified for moving from the first handle
actually list calling a seek function as one of the steps to be done.
(Current POSIX doesn't seem to have any relevant rationale for this
section. The rationale in the 1996 edition says "In requiring the
seek to an appropriate location for the new handle, the application is
required to know what it is doing if it is passing streams with seeks
involved. If the required seek is not done, the results are undefined
(and in fact the program probably will not work on many common
implementations)." - which also doesn't help in understanding the
purpose of "except as required above for the first handle".)
Tested with "make info" and "make pdf".
diff --git a/manual/llio.texi b/manual/llio.texi
index 12194273801adc18..0f84a593ee92b31f 100644
--- a/manual/llio.texi
+++ b/manual/llio.texi
@@ -1097,6 +1097,27 @@ streams persist in other processes, their file positions become
undefined as a result. To prevent this, you must clean up the streams
before destroying them.
+In addition to cleaning up a stream before doing I/O using another
+linked channel, additional precautions are needed to ensure a
+well-defined file position indicator in some cases. If both the
+following conditions hold, you must set the file position indicator on
+the new channel (a stream) using a function such as @code{fseek}.
+
+@itemize @bullet
+@item
+The new linked channel is a stream that was previously active.
+
+@item
+The file position indicator was previously set on that channel (while
+it was previously active) with a function such as @code{fseek}.
+@end itemize
+
+POSIX requires such precautions in more cases: if either the old or
+the new linked channel is a stream (whether or not previously active)
+and the file position indicator was previously set on any channel
+linked to those channels with a function such as @code{fseek} or
+@code{lseek}.
+
@node Independent Channels
@subsection Independent Channels
@cindex independent channels

View File

@ -157,7 +157,7 @@ end \
Summary: The GNU libc libraries Summary: The GNU libc libraries
Name: glibc Name: glibc
Version: %{glibcversion} Version: %{glibcversion}
Release: 135%{?dist} Release: 136%{?dist}
# In general, GPLv2+ is used by programs, LGPLv2+ is used for # In general, GPLv2+ is used by programs, LGPLv2+ is used for
# libraries. # libraries.
@ -909,6 +909,7 @@ Patch670: glibc-RHEL-50662-3.patch
Patch671: glibc-RHEL-50662-4.patch Patch671: glibc-RHEL-50662-4.patch
Patch672: glibc-RHEL-50662-5.patch Patch672: glibc-RHEL-50662-5.patch
Patch673: glibc-RHEL-50662-6.patch Patch673: glibc-RHEL-50662-6.patch
Patch674: glibc-RHEL-46724.patch
############################################################################## ##############################################################################
# Continued list of core "glibc" package information: # Continued list of core "glibc" package information:
@ -3068,6 +3069,9 @@ update_gconv_modules_cache ()
%endif %endif
%changelog %changelog
* Thu Nov 7 2024 Florian Weimer <fweimer@redhat.com> - 2.34-136
- Document rules for mixing stdio streams and file descriptors (RHEL-46724)
* Wed Nov 06 2024 Patsy Griffin <patsy@redhat.com> - 2.34-135 * Wed Nov 06 2024 Patsy Griffin <patsy@redhat.com> - 2.34-135
- Support clearing options in /etc/resolv.conf, RES_OPTIONS with a - prefix - Support clearing options in /etc/resolv.conf, RES_OPTIONS with a - prefix
- Introduce the strict-error/RES_STRICTERR stub resolver option (RHEL-50662) - Introduce the strict-error/RES_STRICTERR stub resolver option (RHEL-50662)