EbuildFetcher: suppress finally blocks after fork
authorZac Medico <zmedico@gentoo.org>
Sat, 13 Nov 2010 17:09:29 +0000 (09:09 -0800)
committerZac Medico <zmedico@gentoo.org>
Wed, 24 Nov 2010 02:02:06 +0000 (18:02 -0800)
This should fix bug #345289.

pym/_emerge/EbuildFetcher.py

index 443ecd529238b0889b229fffc6c5beaa0640616e..614a0decd438b6679eb1e1bfd66ace138e0b8abf 100644 (file)
@@ -1,6 +1,8 @@
 # Copyright 1999-2010 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
+import traceback
+
 from _emerge.SpawnProcess import SpawnProcess
 import sys
 import portage
@@ -95,10 +97,17 @@ class EbuildFetcher(SpawnProcess):
                        not in ('yes', 'true')
 
                rval = 1
-               if fetch(self._uri_map, self._settings, fetchonly=self.fetchonly):
-                       rval = os.EX_OK
-
-               os._exit(rval)
+               try:
+                       if fetch(self._uri_map, self._settings, fetchonly=self.fetchonly):
+                               rval = os.EX_OK
+               except SystemExit:
+                       raise
+               except:
+                       traceback.print_exc()
+               finally:
+                       # Call os._exit() from finally block, in order to suppress any
+                       # finally blocks from earlier in the call stack. See bug #345289.
+                       os._exit(rval)
 
        def _get_uri_map(self, portdb, ebuild_path):
                """