diff --git a/glibc-RHEL-56546.patch b/glibc-RHEL-56546.patch new file mode 100644 index 0000000..f94124f --- /dev/null +++ b/glibc-RHEL-56546.patch @@ -0,0 +1,144 @@ +commit 6c9bb270d6a624f82a38443545e3d99f5b1e07e1 +Author: Florian Weimer +Date: Fri May 16 16:47:02 2025 +0200 + + manual: Clarifications for listing directories + + Support for seeking is limited. Using the d_off and d_reclen members + of struct dirent is discouraged, especially with readdir. Concurrent + modification of directories during iteration may result in duplicate + or missing etnries. + +diff --git a/manual/filesys.texi b/manual/filesys.texi +index aabb68385b6b9732..450d175e614d8834 100644 +--- a/manual/filesys.texi ++++ b/manual/filesys.texi +@@ -409,18 +409,41 @@ entries. It contains the following fields: + This is the null-terminated file name component. This is the only + field you can count on in all POSIX systems. + ++While this field is defined with a specified length, functions such as ++@code{readdir} may return a pointer to a @code{struct dirent} where the ++@code{d_name} extends beyond the end of the struct. ++ + @item ino_t d_fileno + This is the file serial number. For BSD compatibility, you can also + refer to this member as @code{d_ino}. On @gnulinuxhurdsystems{} and most POSIX + systems, for most files this the same as the @code{st_ino} member that + @code{stat} will return for the file. @xref{File Attributes}. + ++@item off_t d_off ++This value contains the offset of the next directory entry (after this ++entry) in the directory stream. The value may not be compatible with ++@code{lseek} or @code{seekdir}, especially if the width of @code{d_off} ++is less than 64 bits. Directory entries are not ordered by offset, and ++the @code{d_off} and @code{d_reclen} values are unrelated. Seeking on ++directory streams is not recommended. The symbol ++@code{_DIRENT_HAVE_D_OFF} is defined if the @code{d_ino} member is ++available. ++ + @item unsigned char d_namlen + This is the length of the file name, not including the terminating + null character. Its type is @code{unsigned char} because that is the + integer type of the appropriate size. This member is a BSD extension. + The symbol @code{_DIRENT_HAVE_D_NAMLEN} is defined if this member is +-available. ++available. (It is not available on Linux.) ++ ++@item unsigned short int d_reclen ++This is the length of the entire directory record. When iterating ++through a buffer filled by @code{getdents64} (@pxref{Low-level Directory ++Access}), this value needs to be added to the offset of the current ++directory entry to obtain the offset of the next entry. When using ++@code{readdir} and related functions, the value of @code{d_reclen} is ++undefined and should not be accessed. The symbol ++@code{_DIRENT_HAVE_D_RECLEN} is defined if this member is available. + + @item unsigned char d_type + This is the type of the file, possibly unknown. The following constants +@@ -457,7 +480,7 @@ This member is a BSD extension. The symbol @code{_DIRENT_HAVE_D_TYPE} + is defined if this member is available. On systems where it is used, it + corresponds to the file type bits in the @code{st_mode} member of + @code{struct stat}. If the value cannot be determined the member +-value is DT_UNKNOWN. These two macros convert between @code{d_type} ++value is @code{DT_UNKNOWN}. These two macros convert between @code{d_type} + values and @code{st_mode} values: + + @deftypefun int IFTODT (mode_t @var{mode}) +@@ -632,6 +655,20 @@ and can be rewritten by a subsequent call. + return entries for @file{.} and @file{..}, even though these are always + valid file names in any directory. @xref{File Name Resolution}. + ++If a directory is modified between a call to @code{readdir} and after ++the directory stream was created or @code{rewinddir} was last called on ++it, it is unspecified according to POSIX whether newly created or ++removed entries appear among the entries returned by repeated ++@code{readdir} calls before the end of the directory is reached. ++However, due to practical implementation constraints, it is possible ++that entries (including unrelated, unmodified entries) appear multiple ++times or do not appear at all if the directory is modified while listing ++it. If the application intends to create files in the directory, it may ++be necessary to complete the iteration first and create a copy of the ++information obtained before creating any new files. (See below for ++instructions regarding copying of @code{d_name}.) The iteration can be ++restarted using @code{rewinddir}. @xref{Random Access Directory}. ++ + If there are no more entries in the directory or an error is detected, + @code{readdir} returns a null pointer. The following @code{errno} error + conditions are defined for this function: +@@ -812,6 +849,10 @@ directory since it was opened with @code{opendir}. (Entries for these + files might or might not be returned by @code{readdir} if they were + added or removed since you last called @code{opendir} or + @code{rewinddir}.) ++ ++For example, it is recommended to call @code{rewinddir} followed by ++@code{readdir} to check if a directory is empty after listing it with ++@code{readdir} and deleting all encountered files from it. + @end deftypefun + + @deftypefun {long int} telldir (DIR *@var{dirstream}) +@@ -823,6 +864,13 @@ added or removed since you last called @code{opendir} or + The @code{telldir} function returns the file position of the directory + stream @var{dirstream}. You can use this value with @code{seekdir} to + restore the directory stream to that position. ++ ++Using the the @code{telldir} function is not recommended. ++ ++The value returned by @code{telldir} may not be compatible with the ++@code{d_off} field in @code{struct dirent}, and cannot be used with the ++@code{lseek} function. The returned value may not unambiguously ++identify the position in the directory stream. + @end deftypefun + + @deftypefun void seekdir (DIR *@var{dirstream}, long int @var{pos}) +@@ -836,6 +884,9 @@ stream @var{dirstream} to @var{pos}. The value @var{pos} must be the + result of a previous call to @code{telldir} on this particular stream; + closing and reopening the directory can invalidate values returned by + @code{telldir}. ++ ++Using the the @code{seekdir} function is not recommended. To seek to ++the beginning of the directory stream, use @code{rewinddir}. + @end deftypefun + + +@@ -1007,9 +1058,20 @@ Note that some file systems support file names longer than + @code{NAME_MAX} bytes (e.g., because they support up to 255 Unicode + characters), so a buffer size of at least 1024 is recommended. + ++If the directory has been modified since the first call to ++@code{getdents64} on the directory (opening the descriptor or seeking to ++offset zero), it is possible that the buffer contains entries that have ++been encountered before. Likewise, it is possible that files that are ++still present are not reported before the end of the directory is ++encountered (and @code{getdents64} returns zero). ++ + This function is specific to Linux. + @end deftypefun + ++Systems that support @code{getdents64} support seeking on directory ++streams. @xref{File Position Primitive}. However, the only offset that ++works reliably is offset zero, indicating that reading the directory ++should start from the beginning. + + @node Working with Directory Trees + @section Working with Directory Trees diff --git a/glibc.spec b/glibc.spec index a83dd9f..1baca33 100644 --- a/glibc.spec +++ b/glibc.spec @@ -157,7 +157,7 @@ end \ Summary: The GNU libc libraries Name: glibc Version: %{glibcversion} -Release: 192%{?dist} +Release: 193%{?dist} # In general, GPLv2+ is used by programs, LGPLv2+ is used for # libraries. @@ -1200,6 +1200,7 @@ Patch892: glibc-RHEL-63210.patch Patch893: glibc-RHEL-65355-1.patch Patch894: glibc-RHEL-65355-2.patch Patch895: glibc-RHEL-71922.patch +Patch896: glibc-RHEL-56546.patch ############################################################################## # Continued list of core "glibc" package information: @@ -3193,6 +3194,9 @@ update_gconv_modules_cache () %endif %changelog +* Fri May 16 2025 Florian Weimer - 2.34-193 +- manual: Clarifications for listing directories (RHEL-56546) + * Thu May 15 2025 Patsy Griffin - 2.34-192 - elf: Keep using minimal malloc after early DTV resize (RHEL-71922)