diff options
| author | Victor Stinner <victor.stinner@gmail.com> | 2017-08-21 18:35:04 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-08-21 18:35:04 +0200 |
| commit | 12a3e343e1667f91c0095a9a7dc15048cb620e41 (patch) | |
| tree | f51bf958e1df657b908b3d1a0725d6332e88dfb4 /Lib/xmlrpc/server.py | |
| parent | 24c0c5b48cb996c3ec1800640edff2bfecc36275 (diff) | |
| download | cpython-git-12a3e343e1667f91c0095a9a7dc15048cb620e41.tar.gz | |
bpo-31247: xmlrpc.server: break reference cycle (#3166) (#3168)
xmlrpc.server now explicitly breaks reference cycles when using
sys.exc_info() in code handling exceptions.
(cherry picked from commit 84524454d0ba77d299741c47bd0f5841ac3f66ce)
Diffstat (limited to 'Lib/xmlrpc/server.py')
| -rw-r--r-- | Lib/xmlrpc/server.py | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py index 6faa2d6f8f..3e0dca027f 100644 --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -264,10 +264,14 @@ class SimpleXMLRPCDispatcher: except: # report exception back to server exc_type, exc_value, exc_tb = sys.exc_info() - response = dumps( - Fault(1, "%s:%s" % (exc_type, exc_value)), - encoding=self.encoding, allow_none=self.allow_none, - ) + try: + response = dumps( + Fault(1, "%s:%s" % (exc_type, exc_value)), + encoding=self.encoding, allow_none=self.allow_none, + ) + finally: + # Break reference cycle + exc_type = exc_value = exc_tb = None return response.encode(self.encoding, 'xmlcharrefreplace') @@ -359,10 +363,14 @@ class SimpleXMLRPCDispatcher: ) except: exc_type, exc_value, exc_tb = sys.exc_info() - results.append( - {'faultCode' : 1, - 'faultString' : "%s:%s" % (exc_type, exc_value)} - ) + try: + results.append( + {'faultCode' : 1, + 'faultString' : "%s:%s" % (exc_type, exc_value)} + ) + finally: + # Break reference cycle + exc_type = exc_value = exc_tb = None return results def _dispatch(self, method, params): @@ -624,10 +632,14 @@ class MultiPathXMLRPCServer(SimpleXMLRPCServer): # (each dispatcher should have handled their own # exceptions) exc_type, exc_value = sys.exc_info()[:2] - response = dumps( - Fault(1, "%s:%s" % (exc_type, exc_value)), - encoding=self.encoding, allow_none=self.allow_none) - response = response.encode(self.encoding, 'xmlcharrefreplace') + try: + response = dumps( + Fault(1, "%s:%s" % (exc_type, exc_value)), + encoding=self.encoding, allow_none=self.allow_none) + response = response.encode(self.encoding, 'xmlcharrefreplace') + finally: + # Break reference cycle + exc_type = exc_value = None return response class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher): |
