Browse Source

Rev3866, Fix and test serving files with null bytes

shortcutme 4 years ago
parent
commit
7418400b52
3 changed files with 34 additions and 4 deletions
  1. 4 3
      plugins/Bigfile/BigfilePlugin.py
  2. 29 0
      plugins/Bigfile/Test/TestBigfile.py
  3. 1 1
      src/Config.py

+ 4 - 3
plugins/Bigfile/BigfilePlugin.py

@@ -605,9 +605,10 @@ class FileRequestPlugin(object):
         if file.read(10) == "\0" * 10:
             # Looks empty, but makes sures we don't have that piece
             file_info = site.content_manager.getFileInfo(inner_path)
-            piece_i = pos / file_info["piece_size"]
-            if not site.storage.piecefields[file_info["sha512"]][piece_i]:
-                return False
+            if "piece_size" in file_info:
+                piece_i = pos / file_info["piece_size"]
+                if not site.storage.piecefields[file_info["sha512"]][piece_i]:
+                    return False
         # Seek back to position we want to read
         file.seek(pos)
         return super(FileRequestPlugin, self).isReadable(site, inner_path, file, pos)

+ 29 - 0
plugins/Bigfile/Test/TestBigfile.py

@@ -491,3 +491,32 @@ class TestBigfile:
 
         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)
+
+    @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

+ 1 - 1
src/Config.py

@@ -13,7 +13,7 @@ class Config(object):
 
     def __init__(self, argv):
         self.version = "0.6.5"
-        self.rev = 3865
+        self.rev = 3866
         self.argv = argv
         self.action = None
         self.pending_changes = {}