--- cfengine-2.2.1/src/cf.defs.h.orig 2007-11-30 08:24:22.122979592 +0000 +++ cfengine-2.2.1/src/cf.defs.h 2007-11-30 08:24:26.734643977 +0000 @@ -287,7 +287,6 @@ #define CF_NONCELEN (CF_BUFSIZE/16) #define CF_MAXLINKSIZE 256 #define CF_MAXLINKLEVEL 4 -#define CF_MAXARGS 31 #define CF_MAXFARGS 8 #define CF_MAX_IP_LEN 64 /* numerical ip length */ #define CF_PROCCOLS 16 --- cfengine-2.2.1/src/cfagent.c.orig 2007-11-30 08:24:04.652251054 +0000 +++ cfengine-2.2.1/src/cfagent.c 2007-11-30 08:47:17.382186413 +0000 @@ -198,8 +198,8 @@ void Initialize(int argc,char *argv[]) -{ char *sp, *cfargv[CF_MAXARGS]; - int i, cfargc, seed; +{ char *sp, **cfargv; + int i, j, cfargc, seed; struct stat statbuf; unsigned char s[16]; char ebuff[CF_EXPANDSIZE]; @@ -235,9 +235,40 @@ /* Everything ends up inside a single argument! Here's the fix */ cfargc = 1; -cfargv[0]="cfagent"; -for (i = 1; i < argc; i++) +/* Pass 1: Find how many arguments there are. */ +for (i = 1, j = 1; i < argc; i++) + { + sp = argv[i]; + + while (*sp != '\0') + { + while (*sp == ' ' && *sp != '\0') /* Skip to arg */ + { + sp++; + } + + cfargc++; + + while (*sp != ' ' && *sp != '\0') /* Skip to white space */ + { + sp++; + } + } + } + +/* Allocate memory for cfargv. */ +cfargv = (char **) malloc(sizeof(char *) * cfargc + 1); +if (! cfargv) + { + /* I guess CfLog(cferror, ...) isn't available yet. */ + fprintf(stderr,"cfagent: Out of memory parsing arguments\n"); + exit(111); + } + +/* Pass 2: Parse the arguments. */ +cfargv[0] = "cfagent"; +for (i = 1, j = 1; i < argc; i++) { sp = argv[i]; @@ -252,7 +283,7 @@ sp++; } - cfargv[cfargc++] = sp; + cfargv[j++] = sp; while (*sp != ' ' && *sp != '\0') /* Skip to white space */ { @@ -260,6 +291,7 @@ } } } +cfargv[j] = 0; VDEFAULTBINSERVER.name = ""; @@ -315,6 +347,7 @@ seed = ElfHash(s); srand48((long)seed); CheckOpts(cfargc,cfargv); + free(cfargv); AddInstallable("no_default_route"); CfenginePort();