--- cscope-15.5/src/find.c.stack 2006-06-23 16:00:34.000000000 -0400 +++ cscope-15.5/src/find.c 2006-06-23 16:00:47.000000000 -0400 @@ -184,7 +184,7 @@ find_symbol_or_assignment(char *pattern, (void) scanpast('\t'); /* find the end of the header */ skiprefchar(); /* skip the file marker */ - putstring(file); /* save the file name */ + putstring(file, PATHLEN); /* save the file name */ (void) strcpy(function, global);/* set the dummy global function name */ (void) strcpy(macro, global);/* set the dummy global macro name */ @@ -216,7 +216,7 @@ find_symbol_or_assignment(char *pattern, /* save the name */ skiprefchar(); - putstring(file); + putstring(file, PATHLEN); /* check for the end of the symbols */ if (*file == '\0') { @@ -255,7 +255,7 @@ find_symbol_or_assignment(char *pattern, } /* save the name */ skiprefchar(); - putstring(s); + putstring(s, PATHLEN); /* see if this is a regular expression pattern */ if (isregexp_valid == YES) { @@ -293,7 +293,7 @@ find_symbol_or_assignment(char *pattern, if (isalpha((unsigned char)firstchar) || firstchar == '_') { blockp = cp; - putstring(symbol); + putstring(symbol, PATHLEN); if (caseless == YES) { s = lcasify(symbol); /* point to lower case version */ } @@ -382,7 +382,7 @@ finddef(char *pattern) case NEWFILE: skiprefchar(); /* save file name */ - putstring(file); + putstring(file, PATHLEN); if (*file == '\0') { /* if end of symbols */ return NULL; } @@ -412,21 +412,36 @@ finddef(char *pattern) } /* find all function definitions (used by samuel only) */ +static void blow_up(int line) +{ + fprintf(stderr,"STACK CORRUPTION AT %d\n",line); + abort(); +} + +#define CHECK_STACK() do { if(test != (unsigned int)&test) {\ +blow_up(__LINE__);\ +}} while(0) + char * findallfcns(char *dummy) { + volatile unsigned int test = 0; char file[PATHLEN + 1]; /* source file name */ char function[PATLEN + 1]; /* function name */ - + char oldblockp; (void) dummy; /* unused argument */ /* find the next file name or definition */ + test = (unsigned int)&test; while (scanpast('\t') != NULL) { + CHECK_STACK(); + oldblockp=*blockp; switch (*blockp) { case NEWFILE: skiprefchar(); /* save file name */ - putstring(file); + putstring(file, PATHLEN); + CHECK_STACK(); if (*file == '\0') { /* if end of symbols */ return NULL; } @@ -440,8 +455,7 @@ findallfcns(char *dummy) case FCNDEF: case CLASSDEF: skiprefchar(); /* save function name */ - putstring(function); - + putstring(function, PATHLEN); /* output the file, function and source line */ putref(0, file, function); break; @@ -483,7 +497,7 @@ findcalling(char *pattern) case NEWFILE: /* save file name */ skiprefchar(); - putstring(file); + putstring(file, PATHLEN); if (*file == '\0') { /* if end of symbols */ return NULL; } @@ -494,7 +508,7 @@ findcalling(char *pattern) case DEFINE: /* could be a macro */ if (fileversion >= 10) { skiprefchar(); - putstring(macro); + putstring(macro, PATHLEN); } break; @@ -504,7 +518,7 @@ findcalling(char *pattern) case FCNDEF: /* save calling function name */ skiprefchar(); - putstring(function); + putstring(function, PATHLEN); for (i = 0; i < morefuns; i++) if ( !strcmp(tmpfunc[i], function) ) break; @@ -639,7 +653,7 @@ findinclude(char *pattern) case NEWFILE: /* save file name */ skiprefchar(); - putstring(file); + putstring(file, PATHLEN); if (*file == '\0') { /* if end of symbols */ return NULL; } @@ -790,7 +804,7 @@ match(void) /* see if this is a regular expression pattern */ if (isregexp_valid == YES) { - putstring(string); + putstring(string, PATHLEN); if (*string == '\0') { return(NO); } @@ -940,26 +954,29 @@ putline(FILE *output) /* put the rest of the cross-reference line into the string */ void -putstring(char *s) +putstring(char *s, int length) { char *cp; unsigned c; - + int i=0; setmark('\n'); cp = blockp; do { - while ((c = (unsigned)(*cp)) != '\n') { + while (((c = (unsigned)(*cp)) != '\n') && (i '\177') { c &= 0177; *s++ = dichar1[c / 8]; *s++ = dichar2[c & 7]; + i+=2; } else { *s++ = c; + i++; } ++cp; } - } while (*(cp + 1) == '\0' && (cp = readblock()) != NULL); + } while (((*(cp + 1) == '\0' && (cp = readblock()) != NULL)) && + (i < length)); blockp = cp; *s = '\0'; } @@ -1059,7 +1076,7 @@ findcalledby(char *pattern) case NEWFILE: skiprefchar(); /* save file name */ - putstring(file); + putstring(file, PATHLEN); if (*file == '\0') { /* if end of symbols */ return(&found_caller); } @@ -1194,7 +1211,7 @@ putpostingref(POSTING *p, char *pat) if (p->type == FCNDEF) { /* need to find the function name */ if (dbseek(p->lineoffset) != -1) { scanpast(FCNDEF); - putstring(function); + putstring(function, PATHLEN); } } else if (p->type != FCNCALL) { @@ -1203,7 +1220,7 @@ putpostingref(POSTING *p, char *pat) } else if (p->fcnoffset != lastfcnoffset) { if (dbseek(p->fcnoffset) != -1) { - putstring(function); + putstring(function, PATHLEN); lastfcnoffset = p->fcnoffset; } } --- cscope-15.5/src/global.h.stack 2006-06-23 16:01:31.000000000 -0400 +++ cscope-15.5/src/global.h 2006-06-23 16:02:55.000000000 -0400 @@ -370,7 +370,7 @@ void postmsg(char *msg); void postmsg2(char *msg); void posterr(char *msg,...); void putposting(char *term, int type); -void putstring(char *s); +void putstring(char *s, int length); void resetcmd(void); void seekline(int line); void setfield(void); --- cscope-15.5/src/build.c.stack 2003-03-05 05:43:59.000000000 -0500 +++ cscope-15.5/src/build.c 2006-06-23 16:00:47.000000000 -0400 @@ -82,7 +82,7 @@ static void copyinverted(void); static char *getoldfile(void); static void movefile(char *new, char *old); static void putheader(char *dir); -static void putinclude(char *s); +static void putinclude(char *s, int len); static void putlist(char **names, int count); static BOOL samelist(FILE *oldrefs, char **names, int count); @@ -512,7 +512,7 @@ getoldfile(void) do { if (*blockp == NEWFILE) { skiprefchar(); - putstring(file); + putstring(file, PATHLEN); if (file[0] != '\0') { /* if not end-of-crossref */ return(file); } @@ -614,7 +614,7 @@ copydata(void) /* look for an #included file */ if (*cp == INCLUDE) { blockp = cp; - putinclude(symbol); + putinclude(symbol, PATHLEN); writestring(symbol); setmark('\t'); cp = blockp; @@ -666,12 +666,12 @@ copyinverted(void) case NEWFILE: /* file name */ return; case INCLUDE: /* #included file */ - putinclude(symbol); + putinclude(symbol, PATHLEN); goto output; } dbputc(type); skiprefchar(); - putstring(symbol); + putstring(symbol, PATHLEN); goto output; } c = *cp; @@ -681,7 +681,7 @@ copyinverted(void) /* if this is a symbol */ if (isalpha((unsigned char)c) || c == '_') { blockp = cp; - putstring(symbol); + putstring(symbol, PATHLEN); type = ' '; output: putposting(symbol, type); @@ -712,11 +712,11 @@ movefile(char *new, char *old) /* process the #included file in the old database */ static void -putinclude(char *s) +putinclude(char *s, int len) { dbputc(INCLUDE); skiprefchar(); - putstring(s); + putstring(s, len); incfile(s + 1, s); }