[tor-commits] [arm/master] fix: pausing interface could cause crash

atagar at torproject.org atagar at torproject.org
Wed Aug 3 16:31:52 UTC 2011


commit 86325e6d124f0b2e5a4826938f2f493495fed9b7
Author: Damian Johnson <atagar at torproject.org>
Date:   Thu Jul 28 11:25:07 2011 -0700

    fix: pausing interface could cause crash
    
    Creating the pause buffer for the bandwidth graph could trigger a panel redraw,
    which in turn attempted to use the uninitialized pause value.
---
 src/cli/graphing/bandwidthStats.py |   11 ++++++++---
 src/util/panel.py                  |    2 +-
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/cli/graphing/bandwidthStats.py b/src/cli/graphing/bandwidthStats.py
index f1891f9..654443c 100644
--- a/src/cli/graphing/bandwidthStats.py
+++ b/src/cli/graphing/bandwidthStats.py
@@ -35,7 +35,7 @@ class BandwidthStats(graphPanel.GraphStats):
   Uses tor BW events to generate bandwidth usage graph.
   """
   
-  def __init__(self, config=None):
+  def __init__(self, config=None, isPauseBuffer=False):
     graphPanel.GraphStats.__init__(self)
     
     self.inputConfig = config
@@ -56,7 +56,7 @@ class BandwidthStats(graphPanel.GraphStats):
     # rate/burst and if tor's using accounting
     conn = torTools.getConn()
     self._titleStats, self.isAccounting = [], False
-    self.resetListener(conn, torTools.State.INIT) # initializes values
+    if not isPauseBuffer: self.resetListener(conn, torTools.State.INIT) # initializes values
     conn.addStatusListener(self.resetListener)
     
     # Initialized the bandwidth totals to the values reported by Tor. This
@@ -78,9 +78,14 @@ class BandwidthStats(graphPanel.GraphStats):
       self.initialSecondaryTotal = int(writeTotal) / 1024 # Bytes -> KB
   
   def clone(self, newCopy=None):
-    if not newCopy: newCopy = BandwidthStats(self.inputConfig)
+    if not newCopy: newCopy = BandwidthStats(self.inputConfig, True)
     newCopy.accountingLastUpdated = self.accountingLastUpdated
     newCopy.accountingInfo = self.accountingInfo
+    
+    # attributes that would have been initialized from calling the resetListener
+    newCopy.isAccounting = self.isAccounting
+    newCopy._titleStats = self._titleStats
+    
     return graphPanel.GraphStats.clone(self, newCopy)
   
   def resetListener(self, conn, eventType):
diff --git a/src/util/panel.py b/src/util/panel.py
index bb47726..732610c 100644
--- a/src/util/panel.py
+++ b/src/util/panel.py
@@ -186,7 +186,7 @@ class Panel():
     """
     
     if not attr in self.pauseAttr: return None
-    elif self.isPaused(): return self.pauseBuffer[attr]
+    elif self.paused: return self.pauseBuffer[attr]
     else: return self.__dict__.get(attr)
   
   def copyAttr(self, attr):





More information about the tor-commits mailing list