Avoid double free in CBT exception handlers

master
Ken Subratie 2023-05-23 13:39:24 -04:00
parent 69380c9bc7
commit 9b7c2e215a
1 changed files with 13 additions and 6 deletions

View File

@ -62,12 +62,15 @@ class ControllerModule:
raise RuntimeError("Unexpected CBT state")
def abort_handler(self, cbt: CBT):
handle = self._abort_handler_tbl.get(cbt.request.action, self.abort_handler_default)
handle = self._abort_handler_tbl.get(
cbt.request.action, self.abort_handler_default
)
try:
handle(cbt)
except Exception as err:
self.logger.exception(err)
self.free_cbt(cbt)
if cbt and not cbt.is_freed:
self.free_cbt(cbt)
def req_handler(self, cbt: CBT):
handle = self._req_handler_tbl.get(cbt.request.action, self.req_handler_default)
@ -75,16 +78,20 @@ class ControllerModule:
handle(cbt)
except Exception as err:
self.logger.exception(err)
cbt.set_response({"Message": "Failed"}, False)
self.complete_cbt(cbt)
if cbt and not cbt.is_completed:
cbt.set_response({"Message": "Failed"}, False)
self.complete_cbt(cbt)
def resp_handler(self, cbt: CBT):
handle = self._resp_handler_tbl.get(cbt.request.action, self.resp_handler_default)
handle = self._resp_handler_tbl.get(
cbt.request.action, self.resp_handler_default
)
try:
handle(cbt)
except Exception as err:
self.logger.exception(err)
self.free_cbt(cbt)
if cbt and not cbt.is_freed:
self.free_cbt(cbt)
@abstractmethod
def on_timer_event(self):