diff options
author | Akihito Izawa <akihito.izawa@qt.io> | 2018-04-09 16:01:02 +0900 |
---|---|---|
committer | Akihito Izawa <akihito.izawa@qt.io> | 2018-04-12 01:29:35 +0000 |
commit | cbf177b96ca83332eab8f576e3cc8abd2aa9ff18 (patch) | |
tree | d330e76f5b6468368117b659a538e2e8e9772909 | |
parent | 4f7726155f586ae3aef0b111ae25eacaab91afe9 (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.cpp | 27 |
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); |