Increase MAXSYM and add sanity checks.
I had jam crash in strange ways because a stack-allocatted aray was
overflowing. Double the limit, and add sanity checks with exit and clear
error messages in case it happens again.
Diff
jam/builtins.c | 28 +++++++++++++++++++++-------
jam/expand.c | 8 ++++++++
jam/headers.c | 4 ++++
jam/jam.h | 2 +-
jam/variable.c | 4 ++++
5 files changed, 33 insertions(+), 13 deletions(-)
@@ -276,19 +276,19 @@
LOL *args,
int *jmp )
{
LIST *l, *r;
LIST *result = 0;
LIST *l, *r;
LIST *result = 0;
for( l = lol_get( args, 0 ); l; l = l->next )
{
regexp *re = regcomp( l->string );
for( l = lol_get( args, 0 ); l; l = l->next )
{
regexp *re = regcomp( l->string );
for( r = lol_get( args, 1 ); r; r = r->next )
if( regexec( re, r->string ) )
for( r = lol_get( args, 1 ); r; r = r->next )
if( regexec( re, r->string ) )
{
int i, top;
@@ -305,14 +305,18 @@
{
char buf[ MAXSYM ];
int l = re->endp[i] - re->startp[i];
if (l > MAXSYM) {
printf("MAXSYM is too low! NEed at least %d\n", l);
exit(-1);
}
memcpy( buf, re->startp[i], l );
buf[ l ] = 0;
result = list_new( result, buf, 0 );
}
}
free( (char *)re );
}
free( (char *)re );
}
return result;
return result;
}
@@ -206,6 +206,10 @@
if (strlen(vars->string) > MAXSYM) {
printf("MAXSYM is too low! Need at least %d\n", l);
exit(-1);
}
strcpy( varname, vars->string );
if( colon = strchr( varname, MAGIC_COLON ) )
@@ -274,6 +278,10 @@
LIST *rem;
char *out1;
if (out - out_buf > MAXSYM) {
printf("MAXSYM is too low!\n");
exit(-1);
}
if( sub2 >= 0 && --sub2 < 0 )
@@ -129,6 +129,10 @@
char buf2[ MAXSYM ];
int l = re[i]->endp[1] - re[i]->startp[1];
if (l > MAXSYM) {
printf("MAXSYM is too low! Need at least %d\n", l);
exit(-1);
}
memcpy( buf2, re[i]->startp[1], l );
buf2[ l ] = 0;
result = list_new( result, buf2, 0 );
@@ -478,7 +478,7 @@
# define MAXSYM 1024 /* longest symbol in the environment */
# define MAXSYM 2048 /* longest symbol in the environment */
# define MAXJPATH 1024 /* longest filename */
# define MAXJOBS 64 /* silently enforce -j limit */
@@ -117,6 +117,10 @@
if (val - *e > MAXSYM) {
printf("MAXSYM is too low, need at least %d\n", val - *e);
exit(-1);
}
strncpy( buf, *e, val - *e );
buf[ val - *e ] = '\0';