summaryrefslogtreecommitdiff
path: root/erts/emulator/beam/erl_message.c
diff options
context:
space:
mode:
authorSverker Eriksson <sverker@erlang.org>2020-12-16 16:31:36 +0100
committerSverker Eriksson <sverker@erlang.org>2020-12-16 16:31:59 +0100
commitc6d5e4312d81f3e711d5be26fa6abf61de0f7805 (patch)
treea7319b447b0ec9dbdefd3a7ff97a5adde5188978 /erts/emulator/beam/erl_message.c
parentda06fd040775fffee17409ebbd6fa797e34d6f99 (diff)
downloaderlang-c6d5e4312d81f3e711d5be26fa6abf61de0f7805.tar.gz
erts: Fix leak in erl_drv_send/output_term
when driver trying to send an invalid term erts_factory_undo() did not free factory->message when mode==FACTORY_HALLOC.
Diffstat (limited to 'erts/emulator/beam/erl_message.c')
-rw-r--r--erts/emulator/beam/erl_message.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_message.c b/erts/emulator/beam/erl_message.c
index cdd771ef7d..eb28774550 100644
--- a/erts/emulator/beam/erl_message.c
+++ b/erts/emulator/beam/erl_message.c
@@ -1805,6 +1805,15 @@ void erts_factory_undo(ErtsHeapFactory* factory)
ERTS_HEAP_FRAG_SIZE(factory->heap_frags_saved->alloc_size));
}
}
+ if (factory->message) {
+ ASSERT(factory->message->data.attached != ERTS_MSG_COMBINED_HFRAG);
+ ASSERT(!factory->message->data.heap_frag);
+
+ /* Set the message to NIL in order for it not to be treated as
+ a distributed message by erts_cleanup_messages */
+ factory->message->m[0] = NIL;
+ erts_cleanup_messages(factory->message);
+ }
}
break;