More null pointer follies in PWB/Graphics

Guy Harris guy at sun.uucp
Sun Jul 21 10:54:48 AEST 1985


The same code fragment that was in those "stat" routines is also in a number
of other commands, so the plague was spread there also.  Here's the fixes:

*** dev.d/hp7220.d/hpd.d/dev.c.BAK	Thu May  2 10:08:14 1985
--- dev.d/hp7220.d/hpd.d/dev.c	Sat Jul 20 17:23:03 1985
***************
*** 100,106
  	if(argc<=1 ) argc=2,argf=0; /* no args,use stdin */
  	else argf=1;
  	while(argc-->1){
! 		if(strcmp(*++argv,"-")==0 || !argf) fpi=stdin;
  		else if( **argv != '-') {
  			if((fpi=fopen(*argv,"r"))==NULL) {
  				ERRPR1(cannot open %s, *argv);

--- 100,106 -----
  	if(argc<=1 ) argc=2,argf=0; /* no args,use stdin */
  	else argf=1;
  	while(argc-->1){
! 		if(!argf || strcmp(*++argv,"-")==0) fpi=stdin;
  		else if( **argv != '-') {
  			if((fpi=fopen(*argv,"r"))==NULL) {
  				ERRPR1(cannot open %s, *argv);

*** dev.d/tek4000.d/td.d/dev.c.BAK	Thu May  2 10:08:47 1985
--- dev.d/tek4000.d/td.d/dev.c	Sat Jul 20 17:29:57 1985
***************
*** 70,76
  	if(argc<=1 ) argc=2,argf=0; /* no args,use stdin */
  	else argf=1;
  	while(argc-->1){
! 		if(strcmp(*++argv,"-")==0 || !argf) fpi=stdin;
  		else if( **argv != '-') {
  			if((fpi=fopen(*argv,"r"))==NULL) {
  				ERRPR1(cannot open %s, *argv);

--- 70,76 -----
  	if(argc<=1 ) argc=2,argf=0; /* no args,use stdin */
  	else argf=1;
  	while(argc-->1){
! 		if(!argf || strcmp(*++argv,"-")==0) fpi=stdin;
  		else if( **argv != '-') {
  			if((fpi=fopen(*argv,"r"))==NULL) {
  				ERRPR1(cannot open %s, *argv);

*** gutil.d/gtop.d/gtop.c.BAK	Thu May  2 10:09:14 1985
--- gutil.d/gtop.d/gtop.c	Sat Jul 20 17:31:30 1985
***************
*** 64,70
  	else argf=1;
  
  	while(argc-- > 1) {
! 		if( strcmp(*++argv,"-")==0 || !argf ) fpi=stdin;
  		else if( **argv!='-' ) {
  			if( (fpi=fopen(*argv,"r"))==NULL ) {
  				ERRPR1(cannot open %s, *argv);

--- 64,70 -----
  	else argf=1;
  
  	while(argc-- > 1) {
! 		if( !argf || strcmp(*++argv,"-")==0 ) fpi=stdin;
  		else if( **argv!='-' ) {
  			if( (fpi=fopen(*argv,"r"))==NULL ) {
  				ERRPR1(cannot open %s, *argv);

*** gutil.d/gd.c.BAK	Thu May  2 10:09:20 1985
--- gutil.d/gd.c	Sat Jul 20 17:32:17 1985
***************
*** 32,38
  	else argf=1;
  
  	while(argc-- > 1) {
! 		if( strcmp(*++argv,"-")==0 || !argf ) fpi=stdin;
  		else if( **argv!='-' ) {
  			if( (fpi=fopen(*argv,"r"))==NULL ) {
  				ERRPR1(cannot open %s, *argv);

--- 32,38 -----
  	else argf=1;
  
  	while(argc-- > 1) {
! 		if( !argf || strcmp(*++argv,"-")==0 ) fpi=stdin;
  		else if( **argv!='-' ) {
  			if( (fpi=fopen(*argv,"r"))==NULL ) {
  				ERRPR1(cannot open %s, *argv);

*** gutil.d/pd.c.BAK	Thu May  2 10:09:20 1985
--- gutil.d/pd.c	Sat Jul 20 17:32:43 1985
***************
*** 30,36
  	else argf=1;
  
  	while(argc-- > 1) {
! 		if( strcmp(*++argv,"-")==0 || !argf ) fpi=stdin;
  		else if( **argv!='-' ) {
  			if((fpi =fopen(*argv,"r")) == NULL) continue;
  		} else { argc++; continue; }

--- 30,36 -----
  	else argf=1;
  
  	while(argc-- > 1) {
! 		if( !argf || strcmp(*++argv,"-")==0 ) fpi=stdin;
  		else if( **argv!='-' ) {
  			if((fpi =fopen(*argv,"r")) == NULL) continue;
  		} else { argc++; continue; }

*** tod.d/vtoc.d/vtoc.c.BAK	Sat Jul 20 17:47:19 1985
--- tod.c/vtoc.d/vtoc.c	Sat Jul 20 17:47:34 1985
***************
*** 64,70
  	if( argc==1 ) argc=2, argf=0; /* no args, use stdin */
  	else argf=1;
  	while (argc-- > 1){
! 		if(strcmp(*++argv,"-") == 0 || !argf) *argv="-";
  		else if(**argv != '-') {
  			if(access(*argv,0) != NULL){
  				ERRPR1(cannot access %s, *argv);

--- 64,70 -----
  	if( argc==1 ) argc=2, argf=0; /* no args, use stdin */
  	else argf=1;
  	while (argc-- > 1){
! 		if(!argf || strcmp(*++argv,"-") == 0) c="-";
  		else if(**argv != '-') {
  			if(access(*argv,0) != NULL){
  				ERRPR1(cannot access %s, *argv);
***************
*** 70,75
  				ERRPR1(cannot access %s, *argv);
  				continue;
  			}
  		} else	{ argc++; continue; }
  
  		mktemp(tempfile);

--- 70,76 -----
  				ERRPR1(cannot access %s, *argv);
  				continue;
  			}
+ 			c = *argv;
  		} else	{ argc++; continue; }
  
  		mktemp(tempfile);
***************
*** 73,79
  		} else	{ argc++; continue; }
  
  		mktemp(tempfile);
! 		sprintf(command,"cat %s|/usr/bin/graf/remcom>%s",*argv,tempfile);
  		system(command);
  		if((fpi=fopen(tempfile,"r")) == NULL) {
  			ERRPR1(cannot open %s,tempfile);

--- 74,80 -----
  		} else	{ argc++; continue; }
  
  		mktemp(tempfile);
! 		sprintf(command,"cat %s|/usr/bin/graf/remcom>%s",c,tempfile);
  		system(command);
  		if((fpi=fopen(tempfile,"r")) == NULL) {
  			ERRPR1(cannot open %s,tempfile);

How about we change the machine whose UNIX port is the basis for all the
USDL systems from a 3B2 to a modified PDP-1?  It's a ones-complement, 18-bit
machine, so that should trip up some code right there.  We add
byte-addressing *but* use the upper-half of a 36-bit double word for the
byte offset, so sizeof(int) != sizeof(char *) and sizeof(char *) !=
sizeof(anything_else *).  Then we give it an MMU so it can run UNIX, and
then map location 0777777 out of the address space *and* use that value for
null pointers.  That way, null pointers will 1) not have an all-zero
representation and 2) not be dereferencable.  If your code works on that
machine, it'll probably work on just about *anything*.  Much better than
using a warmed-over VAX which permits people to keep all the bad habits they
learned on their VAXes at school...  (only 1/2 :-), if that much)

	Guy Harris



More information about the Net.bugs.usg mailing list