[comp.bugs.4bsd] etc/restore gets a segmentation violation in interactive mode +Fix

gww@marduk.UUCP (Gary Winiger) (09/05/87)

Subject: Restore will get a segmentation violation in interactive mode +Fix
Index:	etc/restore/interactive.c 4.3BSD +Fix

Description:
	When running /etc/restore in interactive mode, any attempt to
	reference a subdirectory will cause a segmentation violation
	on systems that do not permit dereferencing a NULL pointer.
Repeat-By:
	On a system that does not permit dereferencing a NULL pointer:

	Make a dump tape from a file system with subdirectories.

	/etc/restore if <tape>
	restore > cd <subdirectory>

	Catch core dump before it hits the floor.
Fix:
	In expandarg() test if lookupname has returned NIL.  If so, set the
	inode number to zero.

	The attached code solves this problem at Elxsi.

Gary..
{ucbvax!sun,lll-lcc!lll-tis,amdahl!amdahl!altos86,bridge2}!elxsi!gww
--------- cut --------- snip --------- :.,$w diff -------------
*** /tmp/,RCSt1000905	Fri Jul 24 14:01:00 1987
--- interactive.c	Fri Jul 24 14:00:36 1987
***************
*** 1,5 ****
--- 1,8 ----
  /*
   * $Log:	interactive.c,v $
+  * Revision 1.2  87/07/24  14:00:13  gww
+  * Don't dereference a NULL pointer.
+  * 
   * Revision 1.1  87/04/01  13:33:28  gww
   * Initial revision
   * 
***************
*** 11,17 ****
   */
  
  #ifndef lint
! static char *ERcsId = "$Header: interactive.c,v 1.1 87/04/01 13:33:28 gww Exp $ ENIX BSD";
  static char sccsid[] = "@(#)interactive.c	5.3 (Berkeley) 7/21/85";
  #endif not lint
  
--- 14,20 ----
   */
  
  #ifndef lint
! static char *ERcsId = "$Header: interactive.c,v 1.2 87/07/24 14:00:13 gww Exp $ ENIX BSD";
  static char sccsid[] = "@(#)interactive.c	5.3 (Berkeley) 7/21/85";
  #endif not lint
  
***************
*** 405,416 ****
  	register struct arglist *ap;
  {
  	static struct afile single;
  	int size;
  
  	ap->head = ap->last = (struct afile *)0;
  	size = expand(arg, 0, ap);
  	if (size == 0) {
! 		single.fnum = lookupname(arg)->e_ino;
  		single.fname = savename(arg);
  		ap->head = &single;
  		ap->last = ap->head + 1;
--- 408,421 ----
  	register struct arglist *ap;
  {
  	static struct afile single;
+ 	struct entry *ep;
  	int size;
  
  	ap->head = ap->last = (struct afile *)0;
  	size = expand(arg, 0, ap);
  	if (size == 0) {
! 		ep = lookupname(arg);
! 		single.fnum = ep != NIL ? ep->e_ino : 0;
  		single.fname = savename(arg);
  		ap->head = &single;
  		ap->last = ap->head + 1;