Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Jul 2001 22:45:18 -0400 (EDT)
From:      Mike Heffner <mheffner@novacoxmail.com>
To:        Assar Westerlund <assar@FreeBSD.ORG>
Cc:        arch@FreeBSD.ORG
Subject:   Re: Making glob(3) portable (was Re: Importing lukemftpd)
Message-ID:  <XFMail.20010725224518.mheffner@novacoxmail.com>
In-Reply-To: <5ly9pduge0.fsf@assaris.sics.se>

next in thread | previous in thread | raw e-mail | index | archive | help
This message is in MIME format
--_=XFMail.1.5.0.FreeBSD:20010725224518:8043=_
Content-Type: text/plain; charset=us-ascii


On 25-Jul-2001 Assar Westerlund wrote:
| Mike Heffner <mheffner@novacoxmail.com> writes:
| 
|> IMO, removing GLOB_LIMITHIT, or whatever, and just using GLOB_NOSPACE with
|> errno=0 would be the first step in the direction of portability.
| 
| Sure, we can do that.

How's the following patch look:


Index: include/glob.h
===================================================================
RCS file: /home/ncvs/src/include/glob.h,v
retrieving revision 1.4
diff -u -r1.4 glob.h
--- include/glob.h      2001/03/19 19:10:06     1.4
+++ include/glob.h      2001/07/26 02:45:43
@@ -77,11 +77,13 @@
 #define        GLOB_NOMAGIC    0x0200  /* GLOB_NOCHECK without magic chars
(csh). */
 #define        GLOB_QUOTE      0x0400  /* Quote special chars with \. */
 #define        GLOB_TILDE      0x0800  /* Expand tilde names from the passwd
file. */
-#define        GLOB_MAXPATH    0x1000  /* limit number of returned paths */
+#define        GLOB_LIMIT      0x1000  /* limit number of returned paths */
 
+/* backwards compatibility, this is the old name for this option */
+#define GLOB_MAXPATH   GLOB_LIMIT
+
 #define        GLOB_NOSPACE    (-1)    /* Malloc call failed. */
 #define        GLOB_ABEND      (-2)    /* Unignored error. */
-#define        GLOB_LIMIT      (-3)    /* Path limit was hit. */
 
 __BEGIN_DECLS
 int    glob __P((const char *, int, int (*)(const char *, int), glob_t *));
Index: lib/libc/gen/glob.3
===================================================================
RCS file: /home/ncvs/src/lib/libc/gen/glob.3,v
retrieving revision 1.16
diff -u -r1.16 glob.3
--- lib/libc/gen/glob.3 2001/07/15 07:53:04     1.16
+++ lib/libc/gen/glob.3 2001/07/26 02:45:43
@@ -260,14 +260,13 @@
 Expand patterns that start with
 .Ql ~
 to user name home directories.
-.It Dv GLOB_MAXPATH
+.It Dv GLOB_LIMIT
 Limit the total number of returned pathnames to the value provided in
-.Fa gl_matchc .
-If
-.Fn glob
-would match more pathnames,
-.Dv GLOB_LIMIT
-will be returned.
+.Fa gl_matchc
+(default ARG_MAX).
+This option should be set for programs that can be coerced to a denial of
service
+attack via patterns that expand to a very large number of matches, such as a
long
+string of */../*/..
 .El
 .Pp
 If, during the search, a directory is encountered that cannot be opened
@@ -377,21 +376,19 @@
 .Aq Pa glob.h :
 .Bl -tag -width GLOB_NOCHECK
 .It Dv GLOB_NOSPACE
-An attempt to allocate memory failed.
+An attempt to allocate memory failed, or if
+.Fa errno
+was 0
+.Dv GLOB_LIMIT
+was specified in the flags and
+.Fa pglob\->gl_matchc
+or more patterns were patched.
 .It Dv GLOB_ABEND
 The scan was stopped because an error was encountered and either
 .Dv GLOB_ERR
 was set or
 .Fa \*(lp*errfunc\*(rp\*(lp\*(rp
 returned non-zero.
-.It Dv GLOB_LIMIT
-The flag
-.Dv GLOB_MAXPATH
-was provided, and the specified limit passed to
-.Fn glob
-in
-.Fa pglob\->gl_matchc
-was reached.
 .El
 .Pp
 The arguments
@@ -427,8 +424,8 @@
 that the flags
 .Dv GLOB_ALTDIRFUNC ,
 .Dv GLOB_BRACE ,
+.Dv GLOB_LIMIT ,
 .Dv GLOB_MAGCHAR ,
-.Dv GLOB_MAXPATH ,
 .Dv GLOB_NOMAGIC ,
 .Dv GLOB_QUOTE ,
 and
Index: lib/libc/gen/glob.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/gen/glob.c,v
retrieving revision 1.17
diff -u -r1.17 glob.c
--- lib/libc/gen/glob.c 2001/03/28 23:55:51     1.17
+++ lib/libc/gen/glob.c 2001/07/26 02:45:45
@@ -170,9 +170,11 @@
                if (!(flags & GLOB_DOOFFS))
                        pglob->gl_offs = 0;
        }
-       if (flags & GLOB_MAXPATH)
+       if (flags & GLOB_LIMIT) {
                limit = pglob->gl_matchc;
-       else
+               if (limit == 0)
+                       limit = ARG_MAX;
+       } else
                limit = 0;
        pglob->gl_flags = flags & ~GLOB_MAGCHAR;
        pglob->gl_errfunc = errfunc;
@@ -687,8 +689,10 @@
        char *copy;
        const Char *p;
 
-       if (*limit && pglob->gl_pathc > *limit)
-               return (GLOB_LIMIT);
+       if (*limit && pglob->gl_pathc > *limit) {
+               errno = 0;
+               return (GLOB_NOSPACE);
+       }
 
        newsize = sizeof(*pathv) * (2 + pglob->gl_pathc + pglob->gl_offs);
        pathv = pglob->gl_pathv ?
Index: libexec/ftpd/ftpd.c
===================================================================
RCS file: /home/ncvs/src/libexec/ftpd/ftpd.c,v
retrieving revision 1.78
diff -u -r1.78 ftpd.c
--- libexec/ftpd/ftpd.c 2001/07/09 17:46:24     1.78
+++ libexec/ftpd/ftpd.c 2001/07/26 02:45:51
@@ -2658,7 +2658,7 @@
 
                memset(&gl, 0, sizeof(gl));
                gl.gl_matchc = MAXGLOBARGS;
-               flags |= GLOB_MAXPATH;
+               flags |= GLOB_LIMIT;
                freeglob = 1;
                if (glob(whichf, flags, 0, &gl)) {
                        reply(550, "not found");
Index: libexec/ftpd/popen.c
===================================================================
RCS file: /home/ncvs/src/libexec/ftpd/popen.c,v
retrieving revision 1.20
diff -u -r1.20 popen.c
--- libexec/ftpd/popen.c        2001/03/19 19:11:00     1.20
+++ libexec/ftpd/popen.c        2001/07/26 02:45:51
@@ -108,7 +108,7 @@
 
                memset(&gl, 0, sizeof(gl));
                gl.gl_matchc = MAXGLOBARGS;
-               flags |= GLOB_MAXPATH;
+               flags |= GLOB_LIMIT;
                if (glob(argv[argc], flags, NULL, &gl))
                        gargv[gargc++] = strdup(argv[argc]);
                else



Mike

-- 
  Mike Heffner         <mheffner@[acm.]vt.edu>
  Fredericksburg, VA       <mikeh@FreeBSD.org>


--_=XFMail.1.5.0.FreeBSD:20010725224518:8043=_
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (FreeBSD)
Comment: For info see http://www.gnupg.org

iD8DBQE7X4Q9FokZQs3sv5kRAlopAJ9g8AGULI7ro7+ATmsqDvpfQKsY8QCghFiY
9vjdx3G27nnALHVxxVSxgOQ=
=lJTd
-----END PGP SIGNATURE-----

--_=XFMail.1.5.0.FreeBSD:20010725224518:8043=_--
End of MIME message

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?XFMail.20010725224518.mheffner>