[tor-bugs] #11769 [Obfsproxy]: Unexpected `NoneType` in obfs3

Tor Bug Tracker & Wiki blackhole at torproject.org
Thu May 8 11:03:00 UTC 2014


#11769: Unexpected `NoneType` in obfs3
---------------------------+-----------------
     Reporter:  asn        |      Owner:  asn
         Type:  defect     |     Status:  new
     Priority:  normal     |  Milestone:
    Component:  Obfsproxy  |    Version:
   Resolution:             |   Keywords:
Actual Points:             |  Parent ID:
       Points:             |
---------------------------+-----------------

Comment (by asn):

 I suspect these two things might be different bugs. Here are some
 partially anonymized debug logs for the bug that crashes on
 `self.circuit.downstream.write()`:

 {{{

 2014-05-06 22:12:33,689 [DEBUG] conn_0x21bb1d0: Connection was lost
 (Connection was closed cleanly.).
 2014-05-06 22:12:33,690 [DEBUG] conn_0x21bb1d0: Closing connection.
 2014-05-06 22:12:33,690 [DEBUG] circ_0x21b9518: Tearing down circuit.
 2014-05-06 22:12:33,690 [DEBUG] ext_0x21bb2d0: Closing connection.
 2014-05-06 22:12:33,724 [DEBUG] circ_0x21b9518: upstream: Received 565
 bytes.
 2014-05-06 22:12:33,731 [ERROR] Unhandled Error
 Traceback (most recent call last):
   File "/usr/local/lib/python2.7/dist-packages/Twisted-13.2.0-py2.7-linux-
 x86_64.egg/twisted/python/log.py", line 88, in callWithLogger
     return callWithContext({"system": lp}, func, *args, **kw)
   File "/usr/local/lib/python2.7/dist-packages/Twisted-13.2.0-py2.7-linux-
 x86_64.egg/twisted/python/log.py", line 73, in callWithContext
     return context.call({ILogContext: newCtx}, func, *args, **kw)
   File "/usr/local/lib/python2.7/dist-packages/Twisted-13.2.0-py2.7-linux-
 x86_64.egg/twisted/python/context.py", line 118, in callWithContext
     return self.currentContext().callWithContext(ctx, func, *args, **kw)
   File "/usr/local/lib/python2.7/dist-packages/Twisted-13.2.0-py2.7-linux-
 x86_64.egg/twisted/python/context.py", line 81, in callWithContext
     return func(*args,**kw)
 --- <exception caught here> ---
   File "/usr/local/lib/python2.7/dist-packages/Twisted-13.2.0-py2.7-linux-
 x86_64.egg/twisted/internet/posixbase.py", line 614, in _doReadOrWrite
     why = selectable.doRead()
   File "/usr/local/lib/python2.7/dist-packages/Twisted-13.2.0-py2.7-linux-
 x86_64.egg/twisted/internet/tcp.py", line 215, in doRead
     return self._dataReceived(data)
   File "/usr/local/lib/python2.7/dist-packages/Twisted-13.2.0-py2.7-linux-
 x86_64.egg/twisted/internet/tcp.py", line 221, in _dataReceived
     rval = self.protocol.dataReceived(data)
   File "/usr/local/lib/python2.7/dist-packages/obfsproxy-0.2
 .9_1_g0005192_dirty-py2.7.egg/obfsproxy/network/extended_orport.py", line
 189, in dataReceived
     self.circuit.dataReceived(self.buffer, self)
   File "/usr/local/lib/python2.7/dist-packages/obfsproxy-0.2
 .9_1_g0005192_dirty-py2.7.egg/obfsproxy/network/network.py", line 157, in
 dataReceived
     self.transport.receivedUpstream(data)
   File "/usr/local/lib/python2.7/dist-packages/obfsproxy-0.2
 .9_1_g0005192_dirty-py2.7.egg/obfsproxy/transports/obfs3.py", line 102, in
 receivedUpstream
     self.circuit.downstream.write(message)
 exceptions.AttributeError: 'NoneType' object has no attribute 'downstream'

 2014-05-06 22:12:33,733 [DEBUG] ext_0x21bb2d0: Connection was lost
 ('NoneType' object has no attribute 'downstream').
 }}}

 So I think what's happening here is the following: The client disconnects
 and the connection is lost. The circuit gets destroyed
 (`self.transport.circuit` is set to `None`), and the ExtendedORPort
 connection also gets closed.
 However, there were still some data on our ExtendedORport buffer that get
 flushed (apparently `transport.loseConnection()` does not work as I
 expected), so that reaches `extended_orport.py:dataReceived()`, and then
 it goes to `self.circuit.dataReceived(self.buffer, self)`. `self.circuit`
 still exists because nothing cleared it, however the circuit attached to
 the transport is set to `None`, so when we reach the transport-specific
 `receivedUpstream()` that tries to write to `self.circuit.downstream` it
 crashes.

 Guarding the `dataReceived` functions with a `if self.closed:` check seems
 to solve the problem in my bridge. However, the first crash still happens.

--
Ticket URL: <https://trac.torproject.org/projects/tor/ticket/11769#comment:1>
Tor Bug Tracker & Wiki <https://trac.torproject.org/>
The Tor Project: anonymity online


More information about the tor-bugs mailing list