[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Problem with 'glob' running under FreeBSD 4.3



Thomas Nystrom <thn@saeab.se> writes:
> Hello!

Hi.

> I have found a problem with the use of the function 'glob' in
> Heimdal/ftpd
> running on a FreeBSD 4.3 system:
> 
> The defined name GLOB_LIMIT is an errorcode in the FreeBSD
> implementation
> of glob (with the value -3) but the Heimdal ftpd uses this name as a
> flag
> to the glob-function. In the Heimdal roken version of glob this is a
> flag
> to glob limiting memory usage. The FreeBSD version of glob fails when it
> gets the created flags (the ftpd simply crashes with a segmentation
> fault).
> 
> By simply removing the GLOB_LIMIT from the flags seems to solve the
> problem.

Thanks for noticing this.  The problem turns out to be that NetBSD, OpenBSD,
and FreeBSD adding a limiting flag to glob() at the same time but the
FreeBSD one was named GLOB_MAXPATH instead of GLOB_LIMIT.  But
GLOB_LIMIT is the name of the error code in FreeBSD, and therefore
the test `works'.

I've applied the patch below, which should make this work.

/assar

Index: cf/broken-glob.m4
===================================================================
RCS file: /afs/pdc.kth.se/src/packages/kth-krb/SourceRepository/aux/broken-glob.m4,v
retrieving revision 1.3
diff -u -w -r1.3 broken-glob.m4
--- cf/broken-glob.m4	2001/03/26 11:40:24	1.3
+++ cf/broken-glob.m4	2001/06/19 09:07:50
@@ -8,7 +8,13 @@
 AC_TRY_LINK([
 #include <stdio.h>
 #include <glob.h>],[
-glob(NULL, GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE|GLOB_LIMIT,
+glob(NULL, GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE|
+#ifdef GLOB_MAXPATH
+GLOB_MAXPATH
+#else
+GLOB_LIMIT
+#endif
+,
 NULL, NULL);
 ],:,ac_cv_func_glob_working=no,:))
 
Index: appl/ftp/ftpd/ftpd.c
===================================================================
RCS file: /afs/pdc.kth.se/src/packages/kth-krb/SourceRepository/appl/ftp/ftpd/ftpd.c,v
retrieving revision 1.157
diff -u -w -r1.157 ftpd.c
--- appl/ftp/ftpd/ftpd.c	2001/04/19 14:41:29	1.157
+++ appl/ftp/ftpd/ftpd.c	2001/06/19 09:07:50
@@ -2165,7 +2165,13 @@
   char buf[MaxPathLen];
 
   if (strpbrk(whichf, "~{[*?") != NULL) {
-    int flags = GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE|GLOB_LIMIT;
+    int flags = GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE|
+#ifdef GLOB_MAXPATH
+	GLOB_MAXPATH
+#else
+	GLOB_LIMIT
+#endif
+	;
 
     memset(&gl, 0, sizeof(gl));
     freeglob = 1;
Index: appl/ftp/ftpd/popen.c
===================================================================
RCS file: /afs/pdc.kth.se/src/packages/kth-krb/SourceRepository/appl/ftp/ftpd/popen.c,v
retrieving revision 1.24
diff -u -w -r1.24 popen.c
--- appl/ftp/ftpd/popen.c	2001/03/26 11:41:02	1.24
+++ appl/ftp/ftpd/popen.c	2001/06/19 09:07:50
@@ -139,7 +139,13 @@
 	for (gargc = argc = 1; argv[argc] && gargc < MAXGLOBS - 1; argc++) {
 		glob_t gl;
 		int flags = GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE
-		    | GLOB_LIMIT;
+		    |
+#ifdef GLOB_MAXPATH
+	GLOB_MAXPATH
+#else
+	GLOB_LIMIT
+#endif
+		    ;
 
 		memset(&gl, 0, sizeof(gl));
 		if (no_glob || glob(argv[argc], flags, NULL, &gl))