[tor-commits] [metrics-lib/master] Avoid invoking overridable methods from constructors.

karsten at torproject.org karsten at torproject.org
Wed Feb 26 11:26:15 UTC 2020


commit 9ccb934fac5827ef663e6740f64c4e06c6cb795e
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Sat Feb 22 09:13:33 2020 +0100

    Avoid invoking overridable methods from constructors.
    
    Fixes #33205.
---
 CHANGELOG.md                                       |  3 ++
 .../descriptor/impl/BridgeNetworkStatusImpl.java   |  4 +--
 .../descriptor/impl/NetworkStatusImpl.java         |  7 ++---
 .../impl/RelayNetworkStatusConsensusImpl.java      |  3 +-
 .../descriptor/impl/RelayNetworkStatusImpl.java    |  3 +-
 .../impl/RelayNetworkStatusVoteImpl.java           | 35 +++++++---------------
 .../impl/RelayNetworkStatusVoteImplTest.java       | 13 ++++++++
 7 files changed, 36 insertions(+), 32 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index bb8bb89..d58e92b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,8 @@
 # Changes in version 2.1?.? - 2020-0?-??
 
+ * Minor changes
+   - Avoid invoking overridable methods from constructors.
+
 
 # Changes in version 2.10.0 - 2020-01-15
 
diff --git a/src/main/java/org/torproject/descriptor/impl/BridgeNetworkStatusImpl.java b/src/main/java/org/torproject/descriptor/impl/BridgeNetworkStatusImpl.java
index d3d546b..b9241a8 100644
--- a/src/main/java/org/torproject/descriptor/impl/BridgeNetworkStatusImpl.java
+++ b/src/main/java/org/torproject/descriptor/impl/BridgeNetworkStatusImpl.java
@@ -22,8 +22,8 @@ public class BridgeNetworkStatusImpl extends NetworkStatusImpl
   protected BridgeNetworkStatusImpl(byte[] rawDescriptorBytes,
       int[] offsetAndLength, File descriptorFile, String fileName)
       throws DescriptorParseException {
-    super(rawDescriptorBytes, offsetAndLength, descriptorFile,
-        false, false);
+    super(rawDescriptorBytes, offsetAndLength, descriptorFile, false);
+    this.splitAndParseParts(false);
     this.setPublishedMillisFromFileName(fileName);
   }
 
diff --git a/src/main/java/org/torproject/descriptor/impl/NetworkStatusImpl.java b/src/main/java/org/torproject/descriptor/impl/NetworkStatusImpl.java
index b994016..4b160f5 100644
--- a/src/main/java/org/torproject/descriptor/impl/NetworkStatusImpl.java
+++ b/src/main/java/org/torproject/descriptor/impl/NetworkStatusImpl.java
@@ -26,14 +26,13 @@ public abstract class NetworkStatusImpl extends DescriptorImpl {
   protected Map<Integer, String> flagStrings = new HashMap<>();
 
   protected NetworkStatusImpl(byte[] rawDescriptorBytes, int[] offsetAndLength,
-      File descriptorFile, boolean containsDirSourceEntries,
-      boolean blankLinesAllowed) throws DescriptorParseException {
+      File descriptorFile, boolean blankLinesAllowed)
+      throws DescriptorParseException {
     super(rawDescriptorBytes, offsetAndLength, descriptorFile,
         blankLinesAllowed);
-    this.splitAndParseParts(containsDirSourceEntries);
   }
 
-  private void splitAndParseParts(boolean containsDirSourceEntries)
+  protected final void splitAndParseParts(boolean containsDirSourceEntries)
       throws DescriptorParseException {
     int firstRIndex = this.findFirstIndexOfKey(Key.R);
     int firstDirectorySignatureIndex = this.findFirstIndexOfKey(
diff --git a/src/main/java/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImpl.java b/src/main/java/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImpl.java
index 79f0756..367865e 100644
--- a/src/main/java/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImpl.java
+++ b/src/main/java/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImpl.java
@@ -25,7 +25,8 @@ public class RelayNetworkStatusConsensusImpl extends NetworkStatusImpl
   protected RelayNetworkStatusConsensusImpl(byte[] consensusBytes,
       int[] offsetAndLimit, File descriptorFile)
       throws DescriptorParseException {
-    super(consensusBytes, offsetAndLimit, descriptorFile, true, false);
+    super(consensusBytes, offsetAndLimit, descriptorFile, false);
+    this.splitAndParseParts(true);
     Set<Key> exactlyOnceKeys = EnumSet.of(
         Key.VOTE_STATUS, Key.CONSENSUS_METHOD, Key.VALID_AFTER, Key.FRESH_UNTIL,
         Key.VALID_UNTIL, Key.VOTING_DELAY, Key.KNOWN_FLAGS);
diff --git a/src/main/java/org/torproject/descriptor/impl/RelayNetworkStatusImpl.java b/src/main/java/org/torproject/descriptor/impl/RelayNetworkStatusImpl.java
index 0fba932..5de8f70 100644
--- a/src/main/java/org/torproject/descriptor/impl/RelayNetworkStatusImpl.java
+++ b/src/main/java/org/torproject/descriptor/impl/RelayNetworkStatusImpl.java
@@ -21,7 +21,8 @@ public class RelayNetworkStatusImpl extends NetworkStatusImpl
 
   protected RelayNetworkStatusImpl(byte[] statusBytes, int[] offsetAndLength,
       File descriptorFile) throws DescriptorParseException {
-    super(statusBytes, offsetAndLength, descriptorFile, false, true);
+    super(statusBytes, offsetAndLength, descriptorFile, true);
+    this.splitAndParseParts(false);
     Set<Key> exactlyOnceKeys = EnumSet.of(
         Key.NETWORK_STATUS_VERSION, Key.DIR_SOURCE, Key.FINGERPRINT,
         Key.CONTACT, Key.DIR_SIGNING_KEY, Key.PUBLISHED);
diff --git a/src/main/java/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java b/src/main/java/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java
index 56a9e21..7e8d816 100644
--- a/src/main/java/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java
+++ b/src/main/java/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java
@@ -26,7 +26,8 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl
   protected RelayNetworkStatusVoteImpl(byte[] voteBytes, int[] offsetAndLength,
       File descriptorFile)
       throws DescriptorParseException {
-    super(voteBytes, offsetAndLength, descriptorFile, false, false);
+    super(voteBytes, offsetAndLength, descriptorFile, false);
+    this.splitAndParseParts(false);
     Set<Key> exactlyOnceKeys = EnumSet.of(
         Key.VOTE_STATUS, Key.PUBLISHED, Key.VALID_AFTER, Key.FRESH_UNTIL,
         Key.VALID_UNTIL, Key.VOTING_DELAY, Key.KNOWN_FLAGS, Key.DIR_SOURCE,
@@ -52,20 +53,6 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl
 
   protected void parseHeader(int offset, int length)
       throws DescriptorParseException {
-    /* Initialize flag-thresholds values here for the case that the vote
-     * doesn't contain those values.  Initializing them in the constructor
-     * or when declaring variables wouldn't work, because those parts are
-     * evaluated later and would overwrite everything we parse here. */
-    this.stableUptime = -1L;
-    this.stableMtbf = -1L;
-    this.fastBandwidth = -1L;
-    this.guardWfu = -1.0;
-    this.guardTk = -1L;
-    this.guardBandwidthIncludingExits = -1L;
-    this.guardBandwidthExcludingExits = -1L;
-    this.enoughMtbfInfo = -1;
-    this.ignoringAdvertisedBws = -1;
-
     Scanner scanner = this.newScanner(offset, length).useDelimiter(NL);
     Key nextCrypto = Key.EMPTY;
     StringBuilder crypto = null;
@@ -847,63 +834,63 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl
     return new TreeSet<>(Arrays.asList(this.knownFlags));
   }
 
-  private long stableUptime;
+  private long stableUptime = -1L;
 
   @Override
   public long getStableUptime() {
     return this.stableUptime;
   }
 
-  private long stableMtbf;
+  private long stableMtbf = -1L;
 
   @Override
   public long getStableMtbf() {
     return this.stableMtbf;
   }
 
-  private long fastBandwidth;
+  private long fastBandwidth = -1L;
 
   @Override
   public long getFastBandwidth() {
     return this.fastBandwidth;
   }
 
-  private double guardWfu;
+  private double guardWfu = -1.0;
 
   @Override
   public double getGuardWfu() {
     return this.guardWfu;
   }
 
-  private long guardTk;
+  private long guardTk = -1L;
 
   @Override
   public long getGuardTk() {
     return this.guardTk;
   }
 
-  private long guardBandwidthIncludingExits;
+  private long guardBandwidthIncludingExits = -1L;
 
   @Override
   public long getGuardBandwidthIncludingExits() {
     return this.guardBandwidthIncludingExits;
   }
 
-  private long guardBandwidthExcludingExits;
+  private long guardBandwidthExcludingExits = -1L;
 
   @Override
   public long getGuardBandwidthExcludingExits() {
     return this.guardBandwidthExcludingExits;
   }
 
-  private int enoughMtbfInfo;
+  private int enoughMtbfInfo = -1;
 
   @Override
   public int getEnoughMtbfInfo() {
     return this.enoughMtbfInfo;
   }
 
-  private int ignoringAdvertisedBws;
+  private int ignoringAdvertisedBws = -1;
 
   @Override
   public int getIgnoringAdvertisedBws() {
diff --git a/src/test/java/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java b/src/test/java/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java
index 6735b61..a9104b4 100644
--- a/src/test/java/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java
+++ b/src/test/java/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java
@@ -721,6 +721,8 @@ public class RelayNetworkStatusVoteImplTest {
     assertEquals(3, vote.getDirKeyCertificateVersion());
     assertEquals("80550987E1D626E3EBA5E5E75A458DE0626D088C",
         vote.getIdentity());
+    assertTrue(vote.isSharedRandParticipate());
+    assertEquals(8, vote.getSharedRandCurrentNumReveals());
     assertEquals(1303882477000L, /* 2011-04-27 05:34:37 */
         vote.getDirKeyPublishedMillis());
     assertEquals(1335504877000L, /* 2012-04-27 05:34:37 */
@@ -745,6 +747,8 @@ public class RelayNetworkStatusVoteImplTest {
         + "F3Yh\nrXVaaoP07r6Ta+s0g1Zijm3lms50Nk/4tV2p8Y63c3F4Q3DAnK40Oi"
         + "kfOIwEj+Ny\n+zBRQssP3hPhTPOj/A7o3mZZwtL6x1sxpeu/nME1l5E=\n"
         + "-----END SIGNATURE-----\n", signature.getSignature());
+    assertEquals(184320, vote.getGuardBandwidthExcludingExits());
+    assertEquals(1, vote.getEnoughMtbfInfo());
     assertTrue(vote.getUnrecognizedLines().isEmpty());
   }
 
@@ -1549,6 +1553,15 @@ public class RelayNetworkStatusVoteImplTest {
   }
 
   @Test
+  public void testSharedRandCurrentValueLineEmpty()
+      throws DescriptorParseException {
+    RelayNetworkStatusVote vote =
+        VoteBuilder.createWithSharedRandCurrentValueLine(null);
+    assertEquals(-1, vote.getSharedRandCurrentNumReveals());
+    assertNull(vote.getSharedRandCurrentValue());
+  }
+
+  @Test
   public void testSharedRandCurrentNoNumReveals()
       throws DescriptorParseException {
     this.thrown.expect(DescriptorParseException.class);



More information about the tor-commits mailing list