From 022884d961f3977e3b6286265d7c853e97155d5f Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Wed, 7 Jan 2015 14:52:47 +0100 Subject: [PATCH 1/2] Do not double free during callbacks. --- generate/combyne/partials/async_function.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/generate/combyne/partials/async_function.cc b/generate/combyne/partials/async_function.cc index 95f26fdf2..6d3771765 100644 --- a/generate/combyne/partials/async_function.cc +++ b/generate/combyne/partials/async_function.cc @@ -114,8 +114,12 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { callback->Call(0, NULL); } - {%each args as arg %} + {%each args|argsInfo as arg %} {%if arg.shouldAlloc %} + {%if not arg.isCppClassStringOrArray %} + {%elsif arg | isOid %} + baton->{{ arg.name}}NeedsFree = false; + {%endif%} free((void*)baton->{{ arg.name }}); {%endif%} {%endeach%} From afc9513cd21b71620f07d3da26b3cf330e4a1f43 Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Wed, 7 Jan 2015 15:51:55 +0100 Subject: [PATCH 2/2] Safer NeedsFree handling. --- generate/combyne/partials/async_function.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/generate/combyne/partials/async_function.cc b/generate/combyne/partials/async_function.cc index 6d3771765..ac0e0d1ee 100644 --- a/generate/combyne/partials/async_function.cc +++ b/generate/combyne/partials/async_function.cc @@ -118,9 +118,13 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { {%if arg.shouldAlloc %} {%if not arg.isCppClassStringOrArray %} {%elsif arg | isOid %} - baton->{{ arg.name}}NeedsFree = false; - {%endif%} + if (baton->{{ arg.name}}NeedsFree) { + baton->{{ arg.name}}NeedsFree = false; + free((void*)baton->{{ arg.name }}); + } + {%else%} free((void*)baton->{{ arg.name }}); + {%endif%} {%endif%} {%endeach%} } @@ -138,6 +142,7 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { {%endif%} {%elsif arg | isOid %} if (baton->{{ arg.name}}NeedsFree) { + baton->{{ arg.name}}NeedsFree = false; free((void *)baton->{{ arg.name }}); } {%endif%}