scc@camjenny.UUCP (Stephen Crawley) (04/16/85)
Index: etc/restore 4.2BSD Description: When restore t is run on a dump of a file system containing a directory which has either of ``.'' or ``..'' missing, it will generate a floating point exception and dump core. Repeat-By: Find yourself a suitably corrupt file system, take a dump of it and run restore t. Fix: What happens is that the treescan() routine in restore/dirs.c finds that ``.'' or ``..'' is missing from a directory, and tries to find an entry in the dump symbol table for the directory so that it can work out the pathname for the error message. The problem is that unlike the other commands, restore t does not build a symbol table, and lookupino() does not check. The fix I chose is to build a symbol table of the nodes listed. Alternatively, treescan() could be changed to just print out the inode number if no symbol table has been allocated. In restore/main.c *************** *** 204,209 */ case 't': setup(); extractdirs(0); while (argc--) { canon(*argv++, name); --- 204,210 ----- */ case 't': setup(); + initsymtable((char *)0); extractdirs(0); while (argc--) { canon(*argv++, name); *************** In restore/restore.c *************** *** 23,28 } vprintf(stdout, "%s", type == LEAF ? "leaf" : "dir "); fprintf(stdout, "%10d\t%s\n", ino, name); return (descend); } --- 23,30 ----- } vprintf(stdout, "%s", type == LEAF ? "leaf" : "dir "); fprintf(stdout, "%10d\t%s\n", ino, name); + if (lookupino(ino) == NIL) + (void) addentry(name, ino, type); return (descend); }