misc/95239: nftw() returns EINVAL for large values of maxfds when it should not

Todd Miller Todd.Miller at courtesan.com
Sun Apr 2 20:50:29 UTC 2006


>Number:         95239
>Category:       misc
>Synopsis:       nftw() returns EINVAL for large values of maxfds when it should not
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Apr 02 20:50:24 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator:     Todd Miller
>Release:        
>Organization:
>Environment:
>Description:
The nftw(3) I wrote for OpenBSD that is now used by FreeBSD has a bug where it returns -1 and sets errno to EINVAL when maxfds > OPEN_MAX.  However, only the older ftw(3) should have this restriction (see single unix or POSIX).

I've inluded the fix I used in OpenBSD but due to the web form submission the patch will likely have to be applied by hand (it is small).
>How-To-Repeat:

>Fix:
Index: ftw.3
===================================================================
RCS file: /home/cvs/freebsd/src/lib/libc/gen/ftw.3,v
retrieving revision 1.3
diff -u -r1.3 ftw.3
--- ftw.3       23 Nov 2005 15:41:36 -0000      1.3
+++ ftw.3       2 Apr 2006 20:37:44 -0000
@@ -185,7 +185,10 @@
 .It Bq Er EINVAL
 The
 .Fa maxfds
-argument is less than 1.
+argument is less than 1 or, in the case of
+.Nm ftw
+only, greater than
+.Dv OPEN_MAX .
 .El
 .Sh SEE ALSO
 .Xr chdir 2 ,
Index: nftw.c
===================================================================
RCS file: /home/cvs/freebsd/src/lib/libc/gen/nftw.c,v
retrieving revision 1.1
diff -u -r1.1 nftw.c
--- nftw.c      24 Aug 2004 13:00:55 -0000      1.1
+++ nftw.c      2 Apr 2006 20:37:07 -0000
@@ -34,7 +34,6 @@
 #include <errno.h>
 #include <fts.h>
 #include <ftw.h>
-#include <limits.h>
 
 int
 nftw(const char *path, int (*fn)(const char *, const struct stat *, int,
@@ -47,7 +46,7 @@
        int error = 0, ftsflags, fnflag, postorder, sverrno;
 
        /* XXX - nfds is currently unused */
-       if (nfds < 1 || nfds > OPEN_MAX) {
+       if (nfds < 1) {
                errno = EINVAL;
                return (-1);
        }
>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list