libc: Remove readdir_r(3)

This function was never safe to use.  We marked it deprecated in the
manual page in 2016, and it is marked obsolete in POSIX 2024.  We
previously added a linker warning and annotated the prototype; now that
stable/15 has been branched, we can remove it from main.

Relnotes:	yes
Reviewed by:	kib
Differential Revision:	https://reviews.freebsd.org/D52474
This commit is contained in:
Dag-Erling Smørgrav
2025-09-10 18:52:50 +02:00
parent c1532f74e4
commit d549de7690
9 changed files with 13 additions and 61 deletions
-1
View File
@@ -342,7 +342,6 @@ MLINKS+=directory.3 closedir.3 \
directory.3 fdopendir.3 \
directory.3 opendir.3 \
directory.3 readdir.3 \
directory.3 readdir_r.3 \
directory.3 rewinddir.3 \
directory.3 seekdir.3 \
directory.3 telldir.3
-1
View File
@@ -418,7 +418,6 @@ FBSD_1.5 {
globfree;
nftw;
readdir;
readdir_r;
scandir;
sem_clockwait_np;
setproctitle_fast;
+4 -47
View File
@@ -25,14 +25,13 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.Dd August 1, 2020
.Dd September 5, 2025
.Dt DIRECTORY 3
.Os
.Sh NAME
.Nm opendir ,
.Nm fdopendir ,
.Nm readdir ,
.Nm readdir_r ,
.Nm telldir ,
.Nm seekdir ,
.Nm rewinddir ,
@@ -50,8 +49,6 @@
.Fn fdopendir "int fd"
.Ft struct dirent *
.Fn readdir "DIR *dirp"
.Ft int
.Fn readdir_r "DIR *dirp" "struct dirent *entry" "struct dirent **result"
.Ft long
.Fn telldir "DIR *dirp"
.Ft void
@@ -65,15 +62,6 @@
.Ft int
.Fn dirfd "DIR *dirp"
.Sh DESCRIPTION
.Bf -symbolic
The
.Fn readdir_r
interface is deprecated
because it cannot be used correctly unless
.Brq Va NAME_MAX
is a fixed value.
.Ef
.Pp
The
.Fn opendir
function
@@ -112,7 +100,6 @@ or to modify the state of the associated description other than by means
of
.Fn closedir ,
.Fn readdir ,
.Fn readdir_r ,
or
.Fn rewinddir ,
the behavior is undefined.
@@ -144,34 +131,6 @@ may be set to any of the values documented for the
system call.
.Pp
The
.Fn readdir_r
function
provides the same functionality as
.Fn readdir ,
but the caller must provide a directory
.Fa entry
buffer to store the results in.
The buffer must be large enough for a
.Vt struct dirent
with a
.Va d_name
array with
.Brq Va NAME_MAX
+ 1 elements.
If the read succeeds,
.Fa result
is pointed at the
.Fa entry ;
upon reaching the end of the directory
.Fa result
is set to
.Dv NULL .
The
.Fn readdir_r
function
returns 0 on success or an error number to indicate failure.
.Pp
The
.Fn telldir
function
returns a token representing the current location associated with the named
@@ -305,9 +264,7 @@ is not associated with a directory.
.Pp
The
.Fn readdir
and
.Fn readdir_r
functions may also fail and set
function may also fail and set
.Va errno
for any of the errors specified for the routine
.Xr getdents 2 .
@@ -338,7 +295,6 @@ The
.Fn fdopendir ,
.Fn opendir ,
.Fn readdir ,
.Fn readdir_r ,
.Fn rewinddir ,
.Fn seekdir
and
@@ -391,7 +347,8 @@ will always set the correct location to return the same value as that last
.Fn readdir
performed.
This is enough for some applications which want to
"push back the last entry read", e.g., Samba.
.Dq push back the last entry read ,
e.g. Samba.
Seeks back to any other location,
other than the beginning of the directory,
may result in unexpected behaviour if deletes are present.
+1
View File
@@ -37,6 +37,7 @@ struct freebsd11_dirent;
struct freebsd11_stat;
struct freebsd11_statfs;
int freebsd15_readdir_r(DIR *, struct dirent *, struct dirent **);
struct freebsd11_dirent *freebsd11_readdir(DIR *);
int freebsd11_readdir_r(DIR *, struct freebsd11_dirent *,
struct freebsd11_dirent **);
-3
View File
@@ -60,7 +60,4 @@ struct _dirdesc {
#define _dirfd(dirp) ((dirp)->dd_fd)
struct dirent;
int __readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
#endif /* !_GEN_PRIVATE_H_ */
+1 -1
View File
@@ -95,7 +95,7 @@ freebsd11_readdir_r(DIR *dirp, struct freebsd11_dirent *entry,
struct dirent xentry, *xresult;
int error;
error = __readdir_r(dirp, &xentry, &xresult);
error = freebsd15_readdir_r(dirp, &xentry, &xresult);
if (error != 0)
return (error);
if (xresult != NULL) {
+4 -4
View File
@@ -41,6 +41,8 @@
#include "gen-private.h"
#include "telldir.h"
#include "gen-compat.h"
/*
* get next entry in a directory.
*/
@@ -104,7 +106,7 @@ readdir(DIR *dirp)
}
int
__readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
freebsd15_readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
{
struct dirent *dp;
int saved_errno;
@@ -133,6 +135,4 @@ __readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
return (0);
}
__strong_reference(__readdir_r, readdir_r);
__warn_references(readdir_r,
"warning: this program uses readdir_r(), which is unsafe.");
__sym_compat(readdir_r, freebsd15_readdir_r, FBSD_1.5);