diff options
| author | Jan Ziak <0xe2.0x9a.0x9b@gmail.com> | 2013-03-19 22:17:39 +0100 |
|---|---|---|
| committer | Jan Ziak <0xe2.0x9a.0x9b@gmail.com> | 2013-03-19 22:17:39 +0100 |
| commit | 54dffda2b6f967d216b59fcbda116c74b07c4990 (patch) | |
| tree | 6e532162f7c62368f2a1c858c9d6adcf4e0ac3df /src/pkg/runtime/hashmap.c | |
| parent | b79afe1b714e225a2b79f639e0956716de34ca64 (diff) | |
| download | go-54dffda2b6f967d216b59fcbda116c74b07c4990.tar.xz | |
runtime: prevent garbage collection during hashmap insertion
Inserting a key-value pair into a hashmap storing keys or values
indirectly can cause the garbage collector to find the hashmap in
an inconsistent state.
Fixes #5074.
R=golang-dev, minux.ma, rsc
CC=golang-dev
https://golang.org/cl/7913043
Diffstat (limited to 'src/pkg/runtime/hashmap.c')
| -rw-r--r-- | src/pkg/runtime/hashmap.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/pkg/runtime/hashmap.c b/src/pkg/runtime/hashmap.c index 37111daa90..dc5dfb82f5 100644 --- a/src/pkg/runtime/hashmap.c +++ b/src/pkg/runtime/hashmap.c @@ -1016,10 +1016,12 @@ runtime·mapassign(MapType *t, Hmap *h, byte *ak, byte *av) res = nil; hit = hash_insert(t, h, ak, (void**)&res); if(!hit) { + // Need to pass dogc=0 to runtime·mallocgc because the garbage collector + // is assuming that all hashmaps are in a consistent state. if(h->flag & IndirectKey) - *(void**)res = runtime·mal(t->key->size); + *(void**)res = runtime·mallocgc(t->key->size, 0, 0, 1); if(h->flag & IndirectVal) - *(void**)(res+h->valoff) = runtime·mal(t->elem->size); + *(void**)(res+h->valoff) = runtime·mallocgc(t->elem->size, 0, 0, 1); } t->key->alg->copy(t->key->size, hash_keyptr(h, res), ak); t->elem->alg->copy(t->elem->size, hash_valptr(h, res), av); |
