From 7a350dd1791c69caf4a232872a48f8f7bd19dacf Mon Sep 17 00:00:00 2001
From: Vojtech Moravec <vojtech.moravec.st@vsb.cz>
Date: Thu, 3 Dec 2020 09:52:08 +0100
Subject: [PATCH] Fix QVC header validation and output better error message.

---
 .../qcmp/cache/QuantizationCacheManager.java     |  2 +-
 .../cz/it4i/qcmp/fileformat/QvcHeaderV1.java     | 16 ++++++++++++++--
 .../cz/it4i/qcmp/fileformat/QvcHeaderV2.java     |  5 ++++-
 3 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/src/main/java/cz/it4i/qcmp/cache/QuantizationCacheManager.java b/src/main/java/cz/it4i/qcmp/cache/QuantizationCacheManager.java
index 9665e73..6142f1e 100644
--- a/src/main/java/cz/it4i/qcmp/cache/QuantizationCacheManager.java
+++ b/src/main/java/cz/it4i/qcmp/cache/QuantizationCacheManager.java
@@ -317,7 +317,7 @@ public class QuantizationCacheManager {
             return;
         }
         if (!qvcFile.getHeader().validateHeader()) {
-            System.err.println("Provided file is corrupted.");
+            System.err.println("Provided file is corrupted. Header is not valid.");
             return;
         }
         final StringBuilder reportBuilder = new StringBuilder();
diff --git a/src/main/java/cz/it4i/qcmp/fileformat/QvcHeaderV1.java b/src/main/java/cz/it4i/qcmp/fileformat/QvcHeaderV1.java
index 5fc30ac..fa602b9 100644
--- a/src/main/java/cz/it4i/qcmp/fileformat/QvcHeaderV1.java
+++ b/src/main/java/cz/it4i/qcmp/fileformat/QvcHeaderV1.java
@@ -1,5 +1,6 @@
 package cz.it4i.qcmp.fileformat;
 
+import cz.it4i.qcmp.U16;
 import cz.it4i.qcmp.data.V2i;
 import cz.it4i.qcmp.data.V3i;
 import cz.it4i.qcmp.io.RawDataIO;
@@ -17,7 +18,6 @@ public class QvcHeaderV1 implements IQvcHeader {
     //endregion
 
     //region Header fields.
-    protected String magicValue;
     protected QuantizationType quantizationType;
     protected int codebookSize;
     protected int trainFileNameSize;
@@ -40,7 +40,19 @@ public class QvcHeaderV1 implements IQvcHeader {
 
     @Override
     public boolean validateHeader() {
-        return (magicValue != null && magicValue.equals(MAGIC_VALUE));
+        if (!quantizationType.isOneOf(QuantizationType.Scalar,
+                                      QuantizationType.Vector1D,
+                                      QuantizationType.Vector2D,
+                                      QuantizationType.Vector3D))
+            return false;
+
+        if (!U16.isInRange(codebookSize))
+            return false;
+
+        if (!U16.isInRange(trainFileNameSize) || trainFileName.length() != trainFileNameSize)
+            return false;
+
+        return U16.isInRange(vectorSizeX) && U16.isInRange(vectorSizeY) && U16.isInRange(vectorSizeZ);
     }
 
     /**
diff --git a/src/main/java/cz/it4i/qcmp/fileformat/QvcHeaderV2.java b/src/main/java/cz/it4i/qcmp/fileformat/QvcHeaderV2.java
index a8e6e36..b3d83e4 100644
--- a/src/main/java/cz/it4i/qcmp/fileformat/QvcHeaderV2.java
+++ b/src/main/java/cz/it4i/qcmp/fileformat/QvcHeaderV2.java
@@ -1,5 +1,7 @@
 package cz.it4i.qcmp.fileformat;
 
+import cz.it4i.qcmp.U16;
+
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
@@ -29,7 +31,8 @@ public class QvcHeaderV2 extends QvcHeaderV1 {
 
     @Override
     public boolean validateHeader() {
-        return (magicValue != null && magicValue.equals(MAGIC_VALUE));
+        final boolean v1HeaderValidation = super.validateHeader();
+        return U16.isInRange(huffmanDataSize) && v1HeaderValidation;
     }
 
     @Override
-- 
GitLab