proper fix for suicide in make when building svn. This was caused by some vast macro expansions writing off then end of some fixed arrays. I increased the size of the arrays and added a check on the end of the array so make dies with a diagnositc rather than a random suicide -Steve Reference: /n/sources/patch/applied/make-big-macro-suicide Date: Tue Jan 22 23:09:39 CET 2013 Signed-off-by: steve@quintile.net --- /sys/src/ape/cmd/make/misc.c Tue Jan 22 23:03:42 2013 +++ /sys/src/ape/cmd/make/misc.c Tue Jan 22 23:03:40 2013 @@ -195,7 +195,7 @@ /* copy string a into b, substituting for arguments */ char * -subst(char *a, char *b) +subst(char *a, char *b, char *e) { static depth = 0; char *s; @@ -226,10 +226,12 @@ *s = '\0'; if( (vbp = varptr(vname)) ->varval != 0) { - b = subst(vbp->varval, b); + b = subst(vbp->varval, b, e); vbp->used = YES; } } + if(b >= e) + fatal("macro expanded too far\n"); } *b = '\0'; --- /sys/src/ape/cmd/make/doname.c Tue Jan 22 23:03:47 2013 +++ /sys/src/ape/cmd/make/doname.c Tue Jan 22 23:03:44 2013 @@ -288,7 +288,7 @@ for( ; q ; q = q->nxtshblock ) { - subst(q->shbp,string); + subst(q->shbp,string,&string[sizeof(string)-1]); ign = ignerr; nopr = NO; doit = NO; --- /sys/src/ape/cmd/make/defs.h Tue Jan 22 23:03:51 2013 +++ /sys/src/ape/cmd/make/defs.h Tue Jan 22 23:03:49 2013 @@ -27,9 +27,9 @@ #define NLEFTS 512 #define NCHARS 500 #define NINTS 250 -#define INMAX 20000 -#define OUTMAX 20000 -#define QBUFMAX 20000 +#define INMAX 40000 +#define OUTMAX 40000 +#define QBUFMAX 40000 #define MAXDIR 10 #define MAXPROC 100 #define MAXINCLUDE 17 @@ -196,7 +196,7 @@ extern char *concat(char *, char *, char *); extern int suffix(char *, char *, char *); extern int *ckalloc(int); -extern char *subst(char *, char *); +extern char *subst(char *, char *, char *); extern void setvar(char *, char *, int); extern void set3var(char *, char *); extern int eqsign(char *); --- /sys/src/ape/cmd/make/gram.y Tue Jan 22 23:03:55 2013 +++ /sys/src/ape/cmd/make/gram.y Tue Jan 22 23:03:53 2013 @@ -377,7 +377,7 @@ lastch = *t; *t = '\0'; /* replace the semi with a null so subst will stop */ -subst(yytext, templin); /* Substitute for macros on dependency lines */ +subst(yytext, templin, &templin[sizeof(templin)-1]); /* Substitute for macros on dependency lines */ if(lastch) /* copy the stuff after the semicolon */ {