Rev3866, Fix and test serving files with null bytes
This commit is contained in:
parent
c165d21d95
commit
7418400b52
3 changed files with 34 additions and 4 deletions
|
@ -605,9 +605,10 @@ class FileRequestPlugin(object):
|
||||||
if file.read(10) == "\0" * 10:
|
if file.read(10) == "\0" * 10:
|
||||||
# Looks empty, but makes sures we don't have that piece
|
# Looks empty, but makes sures we don't have that piece
|
||||||
file_info = site.content_manager.getFileInfo(inner_path)
|
file_info = site.content_manager.getFileInfo(inner_path)
|
||||||
piece_i = pos / file_info["piece_size"]
|
if "piece_size" in file_info:
|
||||||
if not site.storage.piecefields[file_info["sha512"]][piece_i]:
|
piece_i = pos / file_info["piece_size"]
|
||||||
return False
|
if not site.storage.piecefields[file_info["sha512"]][piece_i]:
|
||||||
|
return False
|
||||||
# Seek back to position we want to read
|
# Seek back to position we want to read
|
||||||
file.seek(pos)
|
file.seek(pos)
|
||||||
return super(FileRequestPlugin, self).isReadable(site, inner_path, file, pos)
|
return super(FileRequestPlugin, self).isReadable(site, inner_path, file, pos)
|
||||||
|
|
|
@ -491,3 +491,32 @@ class TestBigfile:
|
||||||
|
|
||||||
site_temp.needFile("%s|%s-%s" % (inner_path, 9 * 1024 * 1024, 10 * 1024 * 1024))
|
site_temp.needFile("%s|%s-%s" % (inner_path, 9 * 1024 * 1024, 10 * 1024 * 1024))
|
||||||
assert site_temp.storage.getSize(inner_path) == site.storage.getSize(inner_path)
|
assert site_temp.storage.getSize(inner_path) == site.storage.getSize(inner_path)
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("size", [1024 * 3, 1024 * 1024 * 3, 1024 * 1024 * 30])
|
||||||
|
def testNullFileRead(self, file_server, site, site_temp, size):
|
||||||
|
inner_path = "data/optional.iso"
|
||||||
|
|
||||||
|
f = site.storage.open(inner_path, "w")
|
||||||
|
f.write("\0" * size)
|
||||||
|
f.close()
|
||||||
|
assert site.content_manager.sign("content.json", self.privatekey)
|
||||||
|
|
||||||
|
# Init source server
|
||||||
|
site.connection_server = file_server
|
||||||
|
file_server.sites[site.address] = site
|
||||||
|
|
||||||
|
# Init client server
|
||||||
|
site_temp.connection_server = FileServer(file_server.ip, 1545)
|
||||||
|
site_temp.connection_server.sites[site_temp.address] = site_temp
|
||||||
|
site_temp.addPeer(file_server.ip, 1544)
|
||||||
|
|
||||||
|
# Download site
|
||||||
|
site_temp.download(blind_includes=True).join(timeout=5)
|
||||||
|
|
||||||
|
if "piecemap" in site.content_manager.getFileInfo(inner_path): # Bigfile
|
||||||
|
site_temp.needFile(inner_path + "|all")
|
||||||
|
else:
|
||||||
|
site_temp.needFile(inner_path)
|
||||||
|
|
||||||
|
|
||||||
|
assert site_temp.storage.getSize(inner_path) == size
|
||||||
|
|
|
@ -13,7 +13,7 @@ class Config(object):
|
||||||
|
|
||||||
def __init__(self, argv):
|
def __init__(self, argv):
|
||||||
self.version = "0.6.5"
|
self.version = "0.6.5"
|
||||||
self.rev = 3865
|
self.rev = 3866
|
||||||
self.argv = argv
|
self.argv = argv
|
||||||
self.action = None
|
self.action = None
|
||||||
self.pending_changes = {}
|
self.pending_changes = {}
|
||||||
|
|
Loading…
Reference in a new issue