From ba06cb401688af0d965044215ed3cc402fa7232e Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Tue, 22 Sep 2015 15:10:46 -0400 Subject: [PATCH] Make re-raising of client exceptions safer Given that we are passing the exception value as a parameter to ignore_not_found() and its ilk, it is very unexpected that they ignore this parameter and instead raise whatever the last exception was. Guard against this by checking that we really are re-raising the same exception, and fall back to re-raising the correct exception with a new stack trace if not. Change-Id: I18a86569a9ba4ee81d943d496349a585dad74ef6 Related-Bug: #1495714 --- heat/engine/clients/client_plugin.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/heat/engine/clients/client_plugin.py b/heat/engine/clients/client_plugin.py index 92fdcd7b7..ac42794d4 100644 --- a/heat/engine/clients/client_plugin.py +++ b/heat/engine/clients/client_plugin.py @@ -174,16 +174,22 @@ class ClientPlugin(object): def ignore_not_found(self, ex): """Raises the exception unless it is a not-found.""" if not self.is_not_found(ex): - exc_info = sys.exc_info() - six.reraise(*exc_info) + exc_type, exc_val, traceback = sys.exc_info() + if exc_val is ex: + six.reraise(exc_type, exc_val, traceback) + else: + raise ex def ignore_conflict_and_not_found(self, ex): """Raises the exception unless it is a conflict or not-found.""" if self.is_conflict(ex) or self.is_not_found(ex): return else: - exc_info = sys.exc_info() - six.reraise(*exc_info) + exc_type, exc_val, traceback = sys.exc_info() + if exc_val is ex: + six.reraise(exc_type, exc_val, traceback) + else: + raise ex def _get_client_args(self, service_name,