From b2dbc2dcc05cde0256947fce42a9774a4bac4af8 Mon Sep 17 00:00:00 2001
From: Jean-Paul Calderone <exarkun@twistedmatrix.com>
Date: Tue, 10 Mar 2020 11:11:21 -0400
Subject: [PATCH] Slightly simplify the bucket size reading code

---
 src/_zkapauthorizer/_storage_server.py | 25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/src/_zkapauthorizer/_storage_server.py b/src/_zkapauthorizer/_storage_server.py
index d49939d..e7d16a7 100644
--- a/src/_zkapauthorizer/_storage_server.py
+++ b/src/_zkapauthorizer/_storage_server.py
@@ -26,6 +26,7 @@ from __future__ import (
 
 from struct import (
     unpack,
+    calcsize,
 )
 
 from errno import (
@@ -507,16 +508,22 @@ def get_storage_index_share_size(sharepath):
 
     :return int: The data size of the share in bytes.
     """
+    # Note Tahoe-LAFS immutable/layout.py makes some claims about how the
+    # share data is structured.  A lot of this seems to be wrong.
+    # storage/immutable.py appears to have the correct information.
+    fmt = ">LL"
     with open(sharepath) as share_file:
-        share_data_length_bytes = share_file.read(8)[4:]
-        if len(share_data_length_bytes) != 4:
-            raise ValueError(
-                "Tried to read 4 bytes of share data length from share, got {!r} instead.".format(
-                    share_data_length_bytes,
-                ),
-            )
-        (share_data_length,) = unpack('>L', share_data_length_bytes)
-        return share_data_length
+        header = share_file.read(calcsize(fmt))
+
+    if len(share_data_length_bytes) != calcsize(fmt):
+        raise ValueError(
+            "Tried to read 4 bytes of share data length from share, got {!r} instead.".format(
+                share_data_length_bytes,
+            ),
+        )
+
+    version, share_data_length = unpack(fmt, header)
+    return share_data_length
 
 
 def get_lease_expiration(get_leases, storage_index_or_slot):
-- 
GitLab