summaryrefslogtreecommitdiffstats
path: root/crypto/heimdal/appl/ftp/ftpd/popen.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/heimdal/appl/ftp/ftpd/popen.c')
-rw-r--r--crypto/heimdal/appl/ftp/ftpd/popen.c19
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);
}
OpenPOWER on IntegriCloud