Long-standing bug in syminit, tickled by placing
initshell before syminit.  Don't understand why syminit
exists at all.
diff --git a/src/cmd/mk/main.c b/src/cmd/mk/main.c
index 645eb7a..28e50c0 100644
--- a/src/cmd/mk/main.c
+++ b/src/cmd/mk/main.c
@@ -39,7 +39,6 @@
 	 *  instead of sharing them
 	 */
 
-	initshell();
 	Binit(&bout, 1, OWRITE);
 	buf = newbuf();
 	whatif = 0;
@@ -120,6 +119,7 @@
 		iflag = 1;
 	usage();
 	syminit();
+	initshell();
 	initenv();
 	usage();
 
diff --git a/src/cmd/mk/symtab.c b/src/cmd/mk/symtab.c
index 6f7b888..06a4d14 100644
--- a/src/cmd/mk/symtab.c
+++ b/src/cmd/mk/symtab.c
@@ -7,11 +7,13 @@
 void
 syminit(void)
 {
-	Symtab **s, *ss;
+	Symtab **s, *ss, *next;
 
 	for(s = hash; s < &hash[NHASH]; s++){
-		for(ss = *s; ss; ss = ss->next)
+		for(ss = *s; ss; ss = next){
+			next = ss->next;
 			free((char *)ss);
+		}
 		*s = 0;
 	}
 }