summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAkihito Izawa <akihito.izawa@qt.io>2018-04-09 16:01:02 +0900
committerAkihito Izawa <akihito.izawa@qt.io>2018-04-12 01:29:35 +0000
commitcbf177b96ca83332eab8f576e3cc8abd2aa9ff18 (patch)
treed330e76f5b6468368117b659a538e2e8e9772909
parent4f7726155f586ae3aef0b111ae25eacaab91afe9 (diff)
Handle the check of binary versus ascii STL files more robustly
Task-number: QTBUG-67552 Change-Id: I30fc50415f155ce990e72287a99bfca35fcf9713 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
-rw-r--r--src/plugins/geometryloaders/default/stlgeometryloader.cpp27
1 files changed, 17 insertions, 10 deletions
diff --git a/src/plugins/geometryloaders/default/stlgeometryloader.cpp b/src/plugins/geometryloaders/default/stlgeometryloader.cpp
index b4b5333cb..1b1dfb2fe 100644
--- a/src/plugins/geometryloaders/default/stlgeometryloader.cpp
+++ b/src/plugins/geometryloaders/default/stlgeometryloader.cpp
@@ -50,25 +50,29 @@ Q_LOGGING_CATEGORY(StlGeometryLoaderLog, "Qt3D.StlGeometryLoader", QtWarningMsg)
bool StlGeometryLoader::doLoad(QIODevice *ioDev, const QString &subMesh)
{
- char signature[5];
-
Q_UNUSED(subMesh);
- if (ioDev->peek(signature, sizeof(signature)) != sizeof(signature))
- return false;
-
- if (!qstrncmp(signature, "solid", 5))
- return loadAscii(ioDev);
- else
- return loadBinary(ioDev);
+ if (loadBinary(ioDev))
+ return true;
- return true;
+ return loadAscii(ioDev);
}
bool StlGeometryLoader::loadAscii(QIODevice *ioDev)
{
// TODO stricter syntax checking
+ ioDev->setTextModeEnabled(true);
+ if (!ioDev->seek(0))
+ return false;
+
+ char signature[5];
+ if (ioDev->peek(signature, sizeof(signature)) != sizeof(signature))
+ return false;
+
+ if (qstrncmp(signature, "solid", 5) != 0)
+ return false;
+
while (!ioDev->atEnd()) {
QByteArray lineBuffer = ioDev->readLine();
@@ -109,6 +113,9 @@ bool StlGeometryLoader::loadBinary(QIODevice *ioDev)
quint32 triangleCount;
stream >> triangleCount;
+ if (ioDev->size() != headerSize + sizeof(quint32) + (triangleCount * 50))
+ return false;
+
m_points.reserve(triangleCount * 3);
m_indices.reserve(triangleCount * 3);