diff --git a/src/_zkapauthorizer/_storage_server.py b/src/_zkapauthorizer/_storage_server.py index d49939d21b50718f9e9275aa4d319f48475c3626..e7d16a7db548d388967021b301127117368fb92e 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):