diff options
-rw-r--r-- | include/fts.h | 3 | ||||
-rw-r--r-- | lib/libc/gen/fts.3 | 23 | ||||
-rw-r--r-- | lib/libc/gen/fts.c | 18 | ||||
-rw-r--r-- | usr.bin/find/function.c | 9 |
4 files changed, 35 insertions, 18 deletions
diff --git a/include/fts.h b/include/fts.h index 825fc5abfe8..da26a8823ee 100644 --- a/include/fts.h +++ b/include/fts.h @@ -1,4 +1,4 @@ -/* $OpenBSD: fts.h,v 1.11 2005/06/17 20:36:55 millert Exp $ */ +/* $OpenBSD: fts.h,v 1.12 2009/08/27 16:19:27 millert Exp $ */ /* $NetBSD: fts.h,v 1.5 1994/12/28 01:41:50 mycroft Exp $ */ /* @@ -79,6 +79,7 @@ typedef struct _ftsent { #define FTS_ROOTPARENTLEVEL -1 #define FTS_ROOTLEVEL 0 +#define FTS_MAXLEVEL 0x7fff short fts_level; /* depth (-1 to N) */ #define FTS_D 1 /* preorder directory */ diff --git a/lib/libc/gen/fts.3 b/lib/libc/gen/fts.3 index cd6bdb78e5d..967346efcd4 100644 --- a/lib/libc/gen/fts.3 +++ b/lib/libc/gen/fts.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: fts.3,v 1.25 2009/03/23 22:57:36 sobrado Exp $ +.\" $OpenBSD: fts.3,v 1.26 2009/08/27 16:19:27 millert Exp $ .\" .\" Copyright (c) 1989, 1991, 1993, 1994 .\" The Regents of the University of California. All rights reserved. @@ -29,7 +29,7 @@ .\" .\" @(#)fts.3 8.5 (Berkeley) 4/16/94 .\" -.Dd $Mdocdate: March 23 2009 $ +.Dd $Mdocdate: August 27 2009 $ .Dt FTS 3 .Os .Sh NAME @@ -230,10 +230,25 @@ was found. The .Li FTSENT structure representing the parent of the starting point (or root) -of the traversal is numbered \-1, and the +of the traversal is numbered +.Ev FTS_PARENTLEVEL +(\-1), and the .Li FTSENT structure for the root -itself is numbered 0. +itself is numbered +.Ev FTS_ROOTLEVEL +(0). +Note that while +.Fa fts_level +cannot hold a number of levels greater than +.Ev FTS_MAXLEVEL , +the +.Nm +functions themselves are not limited to a fixed number +of levels. +Application code that inspects +.Fa fts_level +should be written with this in mind. .It Fa fts_errno Upon return of an .Li FTSENT diff --git a/lib/libc/gen/fts.c b/lib/libc/gen/fts.c index 62b815fd2f0..bbc1dc7475b 100644 --- a/lib/libc/gen/fts.c +++ b/lib/libc/gen/fts.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fts.c,v 1.42 2009/02/11 13:24:05 otto Exp $ */ +/* $OpenBSD: fts.c,v 1.43 2009/08/27 16:19:27 millert Exp $ */ /*- * Copyright (c) 1990, 1993, 1994 @@ -633,15 +633,13 @@ fts_build(FTS *sp, int type) len++; maxlen = sp->fts_pathlen - len; - if (cur->fts_level == SHRT_MAX) { - (void)closedir(dirp); - cur->fts_info = FTS_ERR; - SET(FTS_STOP); - errno = ENAMETOOLONG; - return (NULL); - } - - level = cur->fts_level + 1; + /* + * fts_level is a short so we must prevent it from wrapping + * around to FTS_ROOTLEVEL and FTS_ROOTPARENTLEVEL. + */ + level = cur->fts_level; + if (level < FTS_MAXLEVEL) + level++; /* Read the directory, attaching each entry to the `link' pointer. */ doadjust = 0; diff --git a/usr.bin/find/function.c b/usr.bin/find/function.c index 5f1dac45386..9b928eaf12b 100644 --- a/usr.bin/find/function.c +++ b/usr.bin/find/function.c @@ -1,4 +1,4 @@ -/* $OpenBSD: function.c,v 1.31 2005/06/15 14:19:45 millert Exp $ */ +/* $OpenBSD: function.c,v 1.32 2009/08/27 16:19:27 millert Exp $ */ /*- * Copyright (c) 1990, 1993 @@ -34,7 +34,7 @@ #ifndef lint /*static char sccsid[] = "from: @(#)function.c 8.1 (Berkeley) 6/6/93";*/ -static char rcsid[] = "$OpenBSD: function.c,v 1.31 2005/06/15 14:19:45 millert Exp $"; +static char rcsid[] = "$OpenBSD: function.c,v 1.32 2009/08/27 16:19:27 millert Exp $"; #endif /* not lint */ #include <sys/param.h> @@ -833,9 +833,12 @@ PLAN * c_maxdepth(char *arg, char ***ignored, int unused) { PLAN *new; + const char *errstr = NULL; new = palloc(N_MAXDEPTH, f_maxdepth); - new->max_data = atoi(arg); + new->max_data = strtonum(arg, 1, FTS_MAXLEVEL, &errstr); + if (errstr) + errx(1, "%s: maxdepth value %s", arg, errstr); return (new); } |