immutable: raise LayoutInvalid instead of struct.error when a share is truncated
authorZooko O'Whielacronx <zooko@zooko.com>
Sat, 3 Jan 2009 01:48:06 +0000 (18:48 -0700)
committerZooko O'Whielacronx <zooko@zooko.com>
Sat, 3 Jan 2009 01:48:06 +0000 (18:48 -0700)
To fix this error from the Windows buildslave:

[ERROR]: allmydata.test.test_immutable.Test.test_download_from_only_3_remaining_shares

Traceback (most recent call last):
  File "C:\Documents and Settings\buildslave\windows-native-tahoe\windows\build\src\allmydata\immutable\download.py", line 135, in _bad
    raise NotEnoughSharesError("ran out of peers, last error was %s" % (f,))
allmydata.interfaces.NotEnoughSharesError: ran out of peers, last error was [Failure instance: Traceback: <class 'struct.error'>: unpack requires a string argument of length 4
c:\documents and settings\buildslave\windows-native-tahoe\windows\build\support\lib\site-packages\foolscap-0.3.2-py2.5.egg\foolscap\call.py:667:_done
c:\documents and settings\buildslave\windows-native-tahoe\windows\build\support\lib\site-packages\foolscap-0.3.2-py2.5.egg\foolscap\call.py:53:complete
c:\Python25\lib\site-packages\twisted\internet\defer.py:239:callback
c:\Python25\lib\site-packages\twisted\internet\defer.py:304:_startRunCallbacks
--- <exception caught here> ---
c:\Python25\lib\site-packages\twisted\internet\defer.py:317:_runCallbacks
C:\Documents and Settings\buildslave\windows-native-tahoe\windows\build\src\allmydata\immutable\layout.py:374:_got_length
C:\Python25\lib\struct.py:87:unpack
]
===============================================================================

src/allmydata/immutable/layout.py

index f1e4161785391768279314e75d56d4f58a81560a..16b91c5926c6fd676cc598e0c283b60f5e37f485 100644 (file)
@@ -371,6 +371,8 @@ class ReadBucketProxy:
         offset = self._offsets['uri_extension']
         d = self._read(offset, self._fieldsize)
         def _got_length(data):
+            if len(data) != 4:
+                raise LayoutInvalid("not enough bytes to encode URI length -- %d" % (len(data),))
             length = struct.unpack(self._fieldstruct, data)[0]
             if length >= 2**31:
                 # URI extension blocks are around 419 bytes long, so this must be corrupted.