diff options
Diffstat (limited to 'crypto/heimdal/appl/ftp/ftpd/popen.c')
-rw-r--r-- | crypto/heimdal/appl/ftp/ftpd/popen.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/crypto/heimdal/appl/ftp/ftpd/popen.c b/crypto/heimdal/appl/ftp/ftpd/popen.c index 5f36813..d8a4996 100644 --- a/crypto/heimdal/appl/ftp/ftpd/popen.c +++ b/crypto/heimdal/appl/ftp/ftpd/popen.c @@ -37,7 +37,7 @@ #ifdef HAVE_CONFIG_H #include <config.h> -RCSID("$Id: popen.c,v 1.19 1999/09/16 20:38:45 assar Exp $"); +RCSID("$Id: popen.c,v 1.22 2001/02/05 07:51:51 assar Exp $"); #endif #include <sys/types.h> @@ -61,10 +61,9 @@ RCSID("$Id: popen.c,v 1.19 1999/09/16 20:38:45 assar Exp $"); #include <stdlib.h> #include <string.h> #include <unistd.h> - +#include <roken.h> #include "extern.h" -#include <roken.h> /* * Special version of popen which avoids call to shell. This ensures @@ -97,13 +96,16 @@ ftp_rooted(const char *path) } +#define MAXARGS 100 +#define MAXGLOBS 1000 + FILE * ftpd_popen(char *program, char *type, int do_stderr, int no_glob) { char *cp; FILE *iop; int argc, gargc, pdes[2], pid; - char **pop, *argv[100], *gargv[1000]; + char **pop, *argv[MAXARGS], *gargv[MAXGLOBS]; char *foo; if (strcmp(type, "r") && strcmp(type, "w")) @@ -126,14 +128,15 @@ ftpd_popen(char *program, char *type, int do_stderr, int no_glob) /* break up string into pieces */ foo = NULL; - for (argc = 0, cp = program;; cp = NULL) { + for (argc = 0, cp = program; argc < MAXARGS - 1; cp = NULL) { if (!(argv[argc++] = strtok_r(cp, " \t\n", &foo))) break; } + argv[MAXARGS - 1] = NULL; gargv[0] = (char*)ftp_rooted(argv[0]); /* glob each piece */ - for (gargc = argc = 1; argv[argc]; argc++) { + for (gargc = argc = 1; argv[argc] && gargc < MAXGLOBS - 1; argc++) { glob_t gl; int flags = GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE; @@ -141,7 +144,9 @@ ftpd_popen(char *program, char *type, int do_stderr, int no_glob) if (no_glob || glob(argv[argc], flags, NULL, &gl)) gargv[gargc++] = strdup(argv[argc]); else - for (pop = gl.gl_pathv; *pop; pop++) + for (pop = gl.gl_pathv; + *pop && gargc < MAXGLOBS - 1; + pop++) gargv[gargc++] = strdup(*pop); globfree(&gl); } |