diff --git a/gns3server/modules/qemu/qcow2.py b/gns3server/modules/qemu/qcow2.py index d9bc438a..63c8b4c9 100644 --- a/gns3server/modules/qemu/qcow2.py +++ b/gns3server/modules/qemu/qcow2.py @@ -62,7 +62,10 @@ class Qcow2: with open(self.path, 'rb') as f: content = f.read(struct.calcsize(struct_format)) - self.magic, self.version, self.backing_file_offset, self.backing_file_size = struct.unpack_from(struct_format, content) + try: + self.magic, self.version, self.backing_file_offset, self.backing_file_size = struct.unpack_from(struct_format, content) + except struct.error: + raise Qcow2Error("Invalid file header for {}".format(self.path)) if self.magic != 1363560955: # The first 4 bytes contain the characters 'Q', 'F', 'I' followed by 0xfb. raise Qcow2Error("Invalid magic for {}".format(self.path)) diff --git a/tests/modules/qemu/test_qcow2.py b/tests/modules/qemu/test_qcow2.py index a86ecf67..c4083a78 100644 --- a/tests/modules/qemu/test_qcow2.py +++ b/tests/modules/qemu/test_qcow2.py @@ -56,6 +56,12 @@ def test_invalid_file(): Qcow2("tests/resources/nvram_iou") +def test_invalid_empty_file(tmpdir): + open(str(tmpdir / 'a'), 'w+').close() + with pytest.raises(Qcow2Error): + Qcow2(str(tmpdir / 'a')) + + @pytest.mark.skipif(qemu_img() is None, reason="qemu-img is not available") def test_rebase(tmpdir, loop): shutil.copy("tests/resources/empty8G.qcow2", str(tmpdir / "empty16G.qcow2"))