diff options
author | Neven Sajko <nsajko@gmail.com> | 2020-01-14 04:05:03 +0100 |
---|---|---|
committer | Russ Cox <rsc@swtch.com> | 2020-01-13 22:05:03 -0500 |
commit | 26cae02da740b05da97868b517c58b05f0e37e07 (patch) | |
tree | 3b6bbfe0066e59012d73936b934d12f586483e43 /src | |
parent | 6bddb06b710066a4086dbe77822d02cafecb935b (diff) | |
download | plan9port-26cae02da740b05da97868b517c58b05f0e37e07.tar.gz plan9port-26cae02da740b05da97868b517c58b05f0e37e07.tar.bz2 plan9port-26cae02da740b05da97868b517c58b05f0e37e07.zip |
mk: fix hash function (#315)
Avoid signed integer overflow using ulong instead of long h.
Diffstat (limited to 'src')
-rw-r--r-- | src/cmd/mk/symtab.c | 10 |
1 files changed, 3 insertions, 7 deletions
diff --git a/src/cmd/mk/symtab.c b/src/cmd/mk/symtab.c index 17674c43..2bb28ba8 100644 --- a/src/cmd/mk/symtab.c +++ b/src/cmd/mk/symtab.c @@ -1,7 +1,7 @@ #include "mk.h" #define NHASH 4099 -#define HASHMUL 79L /* this is a good value */ +#define HASHMUL 79UL /* this is a good value */ static Symtab *hash[NHASH]; void @@ -21,14 +21,12 @@ syminit(void) Symtab * symlook(char *sym, int space, void *install) { - long h; + ulong h; char *p; Symtab *s; for(p = sym, h = space; *p; h += *p++) h *= HASHMUL; - if(h < 0) - h = ~h; h %= NHASH; for(s = hash[h]; s; s = s->next) if((s->space == space) && (strcmp(s->name, sym) == 0)) @@ -47,7 +45,7 @@ symlook(char *sym, int space, void *install) void symdel(char *sym, int space) { - long h; + ulong h; char *p; Symtab *s, *ls; @@ -55,8 +53,6 @@ symdel(char *sym, int space) 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)){ |