[tor-commits] [bridgedb/develop] Fix idempotency and reentrancy issues with Bridge.allVanillaAddresses.

isis at torproject.org isis at torproject.org
Tue Jun 2 21:00:15 UTC 2015


commit 6e60cc33bac91442ed7b45994ef312ebd86916bd
Author: Isis Lovecruft <isis at torproject.org>
Date:   Sun May 10 22:38:38 2015 +0000

    Fix idempotency and reentrancy issues with Bridge.allVanillaAddresses.
    
    Conflicts:
    	lib/bridgedb/bridges.py
---
 lib/bridgedb/bridges.py |   21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/lib/bridgedb/bridges.py b/lib/bridgedb/bridges.py
index 37e17cd..e1c8738 100644
--- a/lib/bridgedb/bridges.py
+++ b/lib/bridgedb/bridges.py
@@ -1105,10 +1105,23 @@ class Bridge(BridgeBackwardsCompatibility):
         :returns: All of this bridge's ORAddresses, as well as its ORPort IP
             address and port.
         """
-        addresses = self.orAddresses
-        # Add the default ORPort address (it will always be IPv4, otherwise
-        # Stem should have raised a ValueError during parsing):
-        addresses.append((self.address, self.orPort, 4))
+        # Force deep-copying of the orAddresses.  Otherwise, the later use of
+        # ``addresses.append()`` is both non-reentrant and non-idempotent, as
+        # it would change the value of ``Bridge.orAddresses``, as well as
+        # append a (possibly updated, if ``Bridge.address`` or
+        # ``Bridge.orPort`` changed!) new copy of the bridge's primary
+        # ORAddress each time this property is called.
+        addresses = self.orAddresses[:]
+
+        # Add the default ORPort address.  It will always be IPv4, otherwise
+        # Stem should have raised a ValueError during parsing.  But for
+        # testability, check which type it is:
+        version = 4
+        if isIPv6(self.address):
+            version = 6
+
+        addresses.append((self.address, self.orPort, version))
+
         return addresses
 
     def assertOK(self):





More information about the tor-commits mailing list