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