remove buggy and useless symtab functions neither symdel nor symstat were used anywhere. syminit was used but had no effect. both syminit and symdel dereference pointers after freeing them. symstat can be tricked into writing beyond the bounds of its array diff -c /n/9front/sys/src/cmd/mk/fns.h /sys/src/cmd/mk/fns.h /n/9front/sys/src/cmd/mk/fns.h:64,73 - /sys/src/cmd/mk/fns.h:64,70 void shprint(char*, Envy*, Bufblock*); Word *stow(char*); void subst(char*, char*, char*, int); - void symdel(char*, int); - void syminit(void); Symtab *symlook(char*, int, void*); - void symstat(void); void symtraverse(int, void(*)(Symtab*)); void timeinit(char*); long timeof(char*, int); diff -c /n/9front/sys/src/cmd/mk/main.c /sys/src/cmd/mk/main.c /n/9front/sys/src/cmd/mk/main.c:119,125 - /sys/src/cmd/mk/main.c:119,124 if(aflag) iflag = 1; usage(); - syminit(); initenv(); usage(); diff -c /n/9front/sys/src/cmd/mk/symtab.c /sys/src/cmd/mk/symtab.c /n/9front/sys/src/cmd/mk/symtab.c:4,21 - /sys/src/cmd/mk/symtab.c:4,9 #define HASHMUL 79L /* this is a good value */ static Symtab *hash[NHASH]; - void - syminit(void) - { - Symtab **s, *ss; - - for(s = hash; s < &hash[NHASH]; s++){ - for(ss = *s; ss; ss = ss->next) - free((char *)ss); - *s = 0; - } - } - Symtab * symlook(char *sym, int space, void *install) { /n/9front/sys/src/cmd/mk/symtab.c:43,72 - /sys/src/cmd/mk/symtab.c:31,36 } void - symdel(char *sym, int space) - { - long h; - char *p; - Symtab *s, *ls; - - /* multiple memory leaks */ - - for(p = sym, h = space; *p; h += *p++) - h *= HASHMUL; - if(h < 0) - h = ~h; - h %= NHASH; - for(s = hash[h], ls = 0; s; ls = s, s = s->next) - if((s->space == space) && (strcmp(s->name, sym) == 0)){ - if(ls) - ls->next = s->next; - else - hash[h] = s->next; - free((char *)s); - } - } - - void symtraverse(int space, void (*fn)(Symtab*)) { Symtab **s, *ss; /n/9front/sys/src/cmd/mk/symtab.c:75,95 - /sys/src/cmd/mk/symtab.c:39,42 for(ss = *s; ss; ss = ss->next) if(ss->space == space) (*fn)(ss); - } - - void - symstat(void) - { - Symtab **s, *ss; - int n; - int l[1000]; - - memset((char *)l, 0, sizeof(l)); - for(s = hash; s < &hash[NHASH]; s++){ - for(ss = *s, n = 0; ss; ss = ss->next) - n++; - l[n]++; - } - for(n = 0; n < 1000; n++) - if(l[n]) Bprint(&bout, "%d of length %d\n", l[n], n); }