guy@sun.uucp (Guy Harris) (08/10/85)
Index: usr.bin/lex/lmain.c usr.bin/lex/sub1.c 4.2BSD
(The same bug exists in the S5 "lex" and probably exists
in the V7 "lex" as well).
Description:
1) A couple of bits of code here are really sloppy when it comes
to pointers vs. integers.
2) Some other bits of code are sloppy when it comes to - surprise! -
dereferencing NULL pointers.
Repeat-By:
Try "lex -Q anything.l" if your machine dumps core when dereferencing
null pointers.
Fix:
See following context diffs. Line numbers and exact code
will be different for S3/S5/V7.
diff -c /arch/4.2/usr/src/usr.bin/lex/lmain.c ./lmain.c
*** /arch/4.2/usr/src/usr.bin/lex/lmain.c Thu Aug 11 20:51:24 1983
--- ./lmain.c Tue Aug 6 11:43:35 1985
***************
*** 129,135
dp = dchar = myalloc(DEFCHAR,sizeof(*dchar));
sname = myalloc(STARTSIZE,sizeof(*sname));
sp = schar = myalloc(STARTCHAR,sizeof(*schar));
! if(ccl == 0 || def == 0 || subs == 0 || dchar == 0 || sname == 0 || schar == 0)
error("Too little core to begin");
}
free1core(){
--- 129,135 -----
dp = dchar = myalloc(DEFCHAR,sizeof(*dchar));
sname = myalloc(STARTSIZE,sizeof(*sname));
sp = schar = myalloc(STARTCHAR,sizeof(*schar));
! if(ccl == 0 || pchar == 0 || def == 0 || subs == 0 || dchar == 0 || sname == 0 || schar == 0)
error("Too little core to begin");
}
free1core(){
***************
*** 193,199
# endif
char *myalloc(a,b)
int a,b; {
! register int i;
i = calloc(a, b);
if(i==0)
warning("OOPS - calloc returns a 0");
--- 193,199 -----
# endif
char *myalloc(a,b)
int a,b; {
! register char *i;
i = calloc(a, b);
# ifdef DEBUG
if(i==0)
***************
*** 195,200
int a,b; {
register int i;
i = calloc(a, b);
if(i==0)
warning("OOPS - calloc returns a 0");
else if(i == -1){
--- 195,201 -----
int a,b; {
register char *i;
i = calloc(a, b);
+ # ifdef DEBUG
if(i==0)
warning("OOPS - calloc returns a 0");
# endif
***************
*** 197,205
i = calloc(a, b);
if(i==0)
warning("OOPS - calloc returns a 0");
- else if(i == -1){
- # ifdef DEBUG
- warning("calloc returns a -1");
# endif
return(0);
}
--- 198,203 -----
# ifdef DEBUG
if(i==0)
warning("OOPS - calloc returns a 0");
# endif
return(i);
}
***************
*** 201,208
# ifdef DEBUG
warning("calloc returns a -1");
# endif
- return(0);
- }
return(i);
}
# ifdef DEBUG
--- 199,204 -----
if(i==0)
warning("OOPS - calloc returns a 0");
# endif
return(i);
}
# ifdef DEBUG
***************
*** 208,214
# ifdef DEBUG
buserr(){
fflush(errorf);
! fflush(fout);
fflush(stdout);
fprintf(errorf,"Bus error\n");
if(report == 1)statistics();
--- 204,211 -----
# ifdef DEBUG
buserr(){
fflush(errorf);
! if(fout != NULL)
! fflush(fout);
fflush(stdout);
fprintf(errorf,"Bus error\n");
if(report == 1)statistics();
***************
*** 216,222
}
segviol(){
fflush(errorf);
! fflush(fout);
fflush(stdout);
fprintf(errorf,"Segmentation violation\n");
if(report == 1)statistics();
--- 213,220 -----
}
segviol(){
fflush(errorf);
! if(fout != NULL)
! fflush(fout);
fflush(stdout);
fprintf(errorf,"Segmentation violation\n");
if(report == 1)statistics();
diff -c /arch/4.2/usr/src/usr.bin/lex/sub1.c ./sub1.c
*** /arch/4.2/usr/src/usr.bin/lex/sub1.c Thu Aug 11 20:51:25 1983
--- ./sub1.c Tue Aug 6 11:35:17 1985
***************
*** 62,68
fprintf(errorf,s,p,d);
putc('\n',errorf);
fflush(errorf);
! fflush(fout);
fflush(stdout);
}
index(a,s)
--- 62,69 -----
fprintf(errorf,s,p,d);
putc('\n',errorf);
fflush(errorf);
! if(fout != NULL)
! fflush(fout);
fflush(stdout);
}
index(a,s)guy@sun.uucp (Guy Harris) (08/10/85)
Here's the version of the previous posting about "lex" problems for the S5
"lex". Line numbers may still differ...
1) A couple of bits of code here are really sloppy when it comes to pointers
vs. integers.
2) Some other bits of code are sloppy when it comes to - surprise! -
dereferencing NULL pointers.
3) They also use signal numbers instead of including <signal.h>.
diff -c /arch/s5r2compat/src/lex/main.c ./main.c
*** /arch/s5r2compat/src/lex/main.c Wed Jan 30 19:56:15 1985
--- ./main.c Tue Aug 6 11:45:52 1985
***************
*** 12,19
char **argv; {
register int i;
# ifdef DEBUG
! signal(10,buserr);
! signal(11,segviol);
# endif
while (argc > 1 && argv[1][0] == '-' ){
i = 0;
--- 12,20 -----
char **argv; {
register int i;
# ifdef DEBUG
! #include <signal.h>
! signal(SIGBUS,buserr);
! signal(SIGSEGV,segviol);
# endif
while (argc > 1 && argv[1][0] == '-' ){
i = 0;
***************
*** 127,133
dp = dchar = myalloc(DEFCHAR,sizeof(*dchar));
sname = (char **)myalloc(STARTSIZE,sizeof(*sname));
sp = schar = myalloc(STARTCHAR,sizeof(*schar));
! if(ccl == 0 || def == 0 || subs == 0 || dchar == 0 || sname == 0 || schar == 0)
error("Too little core to begin");
}
free1core(){
--- 128,134 -----
dp = dchar = myalloc(DEFCHAR,sizeof(*dchar));
sname = (char **)myalloc(STARTSIZE,sizeof(*sname));
sp = schar = myalloc(STARTCHAR,sizeof(*schar));
! if(ccl == 0 || pchar == 0 || def == 0 || subs == 0 || dchar == 0 || sname == 0 || schar == 0)
error("Too little core to begin");
}
free1core(){
***************
*** 191,198
# endif
char *myalloc(a,b)
int a,b; {
! register int i;
! i = (int)calloc(a, b);
if(i==0)
warning("OOPS - calloc returns a 0");
else if(i == -1){
--- 192,200 -----
# endif
char *myalloc(a,b)
int a,b; {
! register char *i;
! i = calloc(a, b);
! # ifdef DEBUG
if(i==0)
warning("OOPS - calloc returns a 0");
# endif
***************
*** 195,203
i = (int)calloc(a, b);
if(i==0)
warning("OOPS - calloc returns a 0");
- else if(i == -1){
- # ifdef DEBUG
- warning("calloc returns a -1");
# endif
return(0);
}
--- 197,202 -----
# ifdef DEBUG
if(i==0)
warning("OOPS - calloc returns a 0");
# endif
return(i);
}
***************
*** 199,207
# ifdef DEBUG
warning("calloc returns a -1");
# endif
! return(0);
! }
! return((char *)i);
}
# ifdef DEBUG
buserr(){
--- 198,204 -----
if(i==0)
warning("OOPS - calloc returns a 0");
# endif
! return(i);
}
# ifdef DEBUG
buserr(){
***************
*** 206,212
# ifdef DEBUG
buserr(){
fflush(errorf);
! fflush(fout);
fflush(stdout);
fprintf(errorf,"Bus error\n");
if(report == 1)statistics();
--- 203,210 -----
# ifdef DEBUG
buserr(){
fflush(errorf);
! if(fout != NULL)
! fflush(fout);
fflush(stdout);
fprintf(errorf,"Bus error\n");
if(report == 1)statistics();
***************
*** 214,220
}
segviol(){
fflush(errorf);
! fflush(fout);
fflush(stdout);
fprintf(errorf,"Segmentation violation\n");
if(report == 1)statistics();
--- 212,219 -----
}
segviol(){
fflush(errorf);
! if(fout != NULL)
! fflush(fout);
fflush(stdout);
fprintf(errorf,"Segmentation violation\n");
if(report == 1)statistics();
diff -c /arch/s5r2compat/src/lex/parser.y ./parser.y
*** /arch/s5r2compat/src/lex/parser.y Wed Jan 30 19:56:16 1985
--- ./parser.y Tue Aug 6 11:12:37 1985
***************
*** 220,226
yylex(){
register char *p;
register int c, i;
! char *t, *xp;
int n, j, k, x;
static int sectbegin;
static char token[TOKENSIZE];
--- 220,226 -----
yylex(){
register char *p;
register int c, i;
! register char *t, *xp;
int n, j, k, x;
static int sectbegin;
static char token[TOKENSIZE];
***************
*** 245,252
sectbegin = TRUE;
i = treesize*(sizeof(*name)+sizeof(*left)+
sizeof(*right)+sizeof(*nullstr)+sizeof(*parent))+ALITTLEEXTRA;
! c = (int)myalloc(i,1);
! if(c == 0)
error("Too little core for parse tree");
p = (char *)c;
cfree((char *)p,i,1);
--- 245,252 -----
sectbegin = TRUE;
i = treesize*(sizeof(*name)+sizeof(*left)+
sizeof(*right)+sizeof(*nullstr)+sizeof(*parent))+ALITTLEEXTRA;
! xp = (char *)myalloc(i,1);
! if(xp == 0)
error("Too little core for parse tree");
cfree((char *)xp,i,1);
name = (int *)myalloc(treesize,sizeof(*name));
***************
*** 248,255
c = (int)myalloc(i,1);
if(c == 0)
error("Too little core for parse tree");
! p = (char *)c;
! cfree((char *)p,i,1);
name = (int *)myalloc(treesize,sizeof(*name));
left = (int *)myalloc(treesize,sizeof(*left));
right = (int *)myalloc(treesize,sizeof(*right));
--- 248,254 -----
xp = (char *)myalloc(i,1);
if(xp == 0)
error("Too little core for parse tree");
! cfree((char *)xp,i,1);
name = (int *)myalloc(treesize,sizeof(*name));
left = (int *)myalloc(treesize,sizeof(*left));
right = (int *)myalloc(treesize,sizeof(*right));
diff -c /arch/s5r2compat/src/lex/sub1.c ./sub1.c
*** /arch/s5r2compat/src/lex/sub1.c Wed Jan 30 19:56:17 1985
--- ./sub1.c Tue Aug 6 11:23:46 1985
***************
*** 60,66
fprintf(errorf,s,p,d);
putc('\n',errorf);
fflush(errorf);
! fflush(fout);
fflush(stdout);
}
index(a,s)
--- 60,67 -----
fprintf(errorf,s,p,d);
putc('\n',errorf);
fflush(errorf);
! if(fout != NULL)
! fflush(fout);
fflush(stdout);
}
index(a,s)