diff options
author | Sverker Eriksson <sverker@erlang.org> | 2013-06-14 16:54:36 +0200 |
---|---|---|
committer | Sverker Eriksson <sverker@erlang.org> | 2013-06-14 16:54:36 +0200 |
commit | 80f8aab61f33f3c71e955de4303309e59db1138f (patch) | |
tree | 2924843f43cdfeaf111ff55bd3733936b0ebde35 | |
parent | 710b07ca18417976459335a8b0b81a6f6aa82699 (diff) | |
download | erlang-80f8aab61f33f3c71e955de4303309e59db1138f.tar.gz |
erts: Fix memory leak in term_to_binary/2 with compressed option
-rw-r--r-- | erts/emulator/beam/external.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/erts/emulator/beam/external.c b/erts/emulator/beam/external.c index 45025ad631..249b1e0923 100644 --- a/erts/emulator/beam/external.c +++ b/erts/emulator/beam/external.c @@ -1662,6 +1662,9 @@ static Eterm erts_term_to_binary_int(Process* p, Eterm Term, int level, Uint fla pb->flags = 0; OH_OVERHEAD(&(MSO(p)), pb->size / sizeof(Eterm)); erts_refc_inc(&result_bin->refc, 1); + if (context_b && erts_refc_read(&context_b->refc,0) == 0) { + erts_bin_free(context_b); + } return make_binary(pb); } /* Continue with compression... */ @@ -1736,6 +1739,9 @@ static Eterm erts_term_to_binary_int(Process* p, Eterm Term, int level, Uint fla context->s.cc.result_bin = NULL; context->alive = 0; BUMP_REDS(p, (this_time * CONTEXT_REDS) / TERM_TO_BINARY_COMPRESS_CHUNK); + if (context_b && erts_refc_read(&context_b->refc,0) == 0) { + erts_bin_free(context_b); + } return make_binary(pb); } default: /* Compression error, revert to uncompressed binary (still in @@ -1758,6 +1764,9 @@ static Eterm erts_term_to_binary_int(Process* p, Eterm Term, int level, Uint fla context->s.cc.destination_bin = NULL; context->alive = 0; BUMP_REDS(p, (this_time * CONTEXT_REDS) / TERM_TO_BINARY_COMPRESS_CHUNK); + if (context_b && erts_refc_read(&context_b->refc,0) == 0) { + erts_bin_free(context_b); + } return make_binary(pb); } } |