View | Details | Raw Unified | Return to bug 23352
Collapse All | Expand All

(-)popen.c (-4 / +9 lines)
Lines 82-91 Link Here
82
#include <string.h>
82
#include <string.h>
83
#endif /* HAVE_STRING_H */
83
#endif /* HAVE_STRING_H */
84
84
85
#include "opie.h"
85
#include "opie.h"
86
86
87
#define MAXUSRARGS	100
88
#define MAXGLOBARGS	1000
89
87
char **ftpglob __P((register char *));
90
char **ftpglob __P((register char *));
88
char **copyblk __P((char **));
91
char **copyblk __P((char **));
89
VOIDRET blkfree __P((char **));
92
VOIDRET blkfree __P((char **));
90
93
91
/*
94
/*
Lines 101-134 Link Here
101
FILE *ftpd_popen FUNCTION((program, type), char *program AND char *type)
104
FILE *ftpd_popen FUNCTION((program, type), char *program AND char *type)
102
{
105
{
103
  char *cp;
106
  char *cp;
104
  FILE *iop;
107
  FILE *iop;
105
  int argc, gargc, pdes[2];
108
  int argc, gargc, pdes[2];
106
  char **pop, *argv[100], *gargv[1000], *vv[2];
109
  char **pop, *argv[MAXUSRARGS], *gargv[MAXGLOBARGS], *vv[2];
107
110
108
  if ((*type != 'r' && *type != 'w') || type[1])
111
  if ((*type != 'r' && *type != 'w') || type[1])
109
    return (NULL);
112
    return (NULL);
110
113
111
  if (pipe(pdes) < 0)
114
  if (pipe(pdes) < 0)
112
    return (NULL);
115
    return (NULL);
113
116
114
  /* break up string into pieces */
117
  /* break up string into pieces */
115
  for (argc = 0, cp = program;; cp = NULL)
118
  for (argc = 0, cp = program; argc < MAXUSRARGS-1; cp = NULL) {
116
    if (!(argv[argc++] = strtok(cp, " \t\n")))
119
    if (!(argv[argc++] = strtok(cp, " \t\n")))
117
      break;
120
      break;
121
  }
122
  argv[argc - 1] = NULL;
118
123
119
  /* glob each piece */
124
  /* glob each piece */
120
  gargv[0] = argv[0];
125
  gargv[0] = argv[0];
121
  for (gargc = argc = 1; argv[argc]; argc++) {
126
  for (gargc = argc = 1; argv[argc] && gargc < (MAXGLOBARGS-1); argc++) {
122
    if (!(pop = (char **) ftpglob(argv[argc]))) {
127
    if (!(pop = (char **) ftpglob(argv[argc]))) {
123
      /* globbing failed */
128
      /* globbing failed */
124
      vv[0] = argv[argc];
129
      vv[0] = argv[argc];
125
      vv[1] = NULL;
130
      vv[1] = NULL;
126
      pop = (char **) copyblk(vv);
131
      pop = (char **) copyblk(vv);
127
    }
132
    }
128
    argv[argc] = (char *) pop;	/* save to free later */
133
    argv[argc] = (char *) pop;	/* save to free later */
129
    while (*pop && gargc < 1000)
134
    while (*pop && gargc < MAXGLOBARGS-1)
130
      gargv[gargc++] = *pop++;
135
      gargv[gargc++] = *pop++;
131
  }
136
  }
132
  gargv[gargc] = NULL;
137
  gargv[gargc] = NULL;
133
138
134
  iop = NULL;
139
  iop = NULL;

Return to bug 23352