readdir_r(3) was never necessary and has been deprecated by POSIX.
authorguenther <guenther@openbsd.org>
Sat, 23 Mar 2024 16:30:01 +0000 (16:30 +0000)
committerguenther <guenther@openbsd.org>
Sat, 23 Mar 2024 16:30:01 +0000 (16:30 +0000)
Document that in the manpage and stop using it internally.

ok deraadt@ millert@ jmc@

lib/libc/gen/opendir.3
lib/libskey/skeylogin.c

index c5db947..397508f 100644 (file)
@@ -1,4 +1,4 @@
-.\"    $OpenBSD: opendir.3,v 1.2 2022/09/11 06:38:10 jmc Exp $
+.\"    $OpenBSD: opendir.3,v 1.3 2024/03/23 16:30:01 guenther Exp $
 .\"
 .\" Copyright (c) 1983, 1991, 1993
 .\"    The Regents of the University of California.  All rights reserved.
@@ -27,7 +27,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd $Mdocdate: September 11 2022 $
+.Dd $Mdocdate: March 23 2024 $
 .Dt OPENDIR 3
 .Os
 .Sh NAME
@@ -112,9 +112,11 @@ operation.
 .Pp
 The
 .Fn readdir_r
-function (much like
-.Fn readdir )
-initializes the
+function is a deprecated variant of
+.Fn readdir .
+Like
+.Fn readdir ,
+it initializes the
 .Vt dirent
 structure referenced by
 .Fa entry
@@ -304,3 +306,11 @@ The
 .Fn fdopendir
 function appeared in
 .Ox 5.0 .
+.Sh CAVEATS
+The
+.Fn readdir_r
+function was intended to provide a thread-safe version of
+.Fn readdir .
+However, it was later found to be both unnecessary in the typical
+usage and unportable due to insufficient buffer sizing guidance.
+It was therefore officially deprecated in issue 8.
index 0b73529..78f1d8b 100644 (file)
@@ -10,7 +10,7 @@
  *
  * S/Key verification check, lookups, and authentication.
  *
- * $OpenBSD: skeylogin.c,v 1.64 2023/03/15 17:01:35 millert Exp $
+ * $OpenBSD: skeylogin.c,v 1.65 2024/03/23 16:30:01 guenther Exp $
  */
 
 #ifdef QUOTA
@@ -207,7 +207,7 @@ skeylookup(struct skey *mp, char *name)
 int
 skeygetnext(struct skey *mp)
 {
-       struct dirent entry, *dp;
+       struct dirent *dp;
        int rval;
 
        if (mp->keyfile != NULL) {
@@ -220,10 +220,10 @@ skeygetnext(struct skey *mp)
                return (-1);
 
        rval = 1;
-       while ((readdir_r(mp->keydir, &entry, &dp)) == 0 && dp == &entry) {
+       while ((dp = readdir(mp->keydir)) != NULL) {
                /* Skip dot files and zero-length files. */
-               if (entry.d_name[0] != '.' &&
-                   (rval = skeygetent(-1, mp, entry.d_name)) != 1)
+               if (dp->d_name[0] != '.' &&
+                   (rval = skeygetent(-1, mp, dp->d_name)) != 1)
                        break;
        }