aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2013-06-14 16:54:36 +0200
committerSverker Eriksson <[email protected]>2013-06-14 16:54:36 +0200
commit80f8aab61f33f3c71e955de4303309e59db1138f (patch)
tree2924843f43cdfeaf111ff55bd3733936b0ebde35 /erts/emulator/beam
parent710b07ca18417976459335a8b0b81a6f6aa82699 (diff)
downloadotp-80f8aab61f33f3c71e955de4303309e59db1138f.tar.gz
otp-80f8aab61f33f3c71e955de4303309e59db1138f.tar.bz2
otp-80f8aab61f33f3c71e955de4303309e59db1138f.zip
erts: Fix memory leak in term_to_binary/2 with compressed option
Diffstat (limited to 'erts/emulator/beam')
-rw-r--r--erts/emulator/beam/external.c9
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);
}
}