From 51a4154ae7eed98dabf14be471ee5c7c60aab112 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Wed, 30 Mar 2016 16:56:39 -0700 Subject: [PATCH] Check results of qUncompress, and catch fbx reader throws in utility programs. --- interface/src/ModelPackager.cpp | 15 ++++++++++----- libraries/fbx/src/FBXReader_Node.cpp | 3 +++ tools/vhacd-util/src/VHACDUtil.cpp | 26 +++++++++++++++----------- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/interface/src/ModelPackager.cpp b/interface/src/ModelPackager.cpp index fa87a5f657..44768db93c 100644 --- a/interface/src/ModelPackager.cpp +++ b/interface/src/ModelPackager.cpp @@ -105,13 +105,18 @@ bool ModelPackager::loadModel() { qWarning() << QString("ModelPackager::loadModel(): Could not open FBX file %1").arg(_fbxInfo.filePath()); return false; } - qCDebug(interfaceapp) << "Reading FBX file : " << _fbxInfo.filePath(); - QByteArray fbxContents = fbx.readAll(); + try { + qCDebug(interfaceapp) << "Reading FBX file : " << _fbxInfo.filePath(); + QByteArray fbxContents = fbx.readAll(); - _geometry.reset(readFBX(fbxContents, QVariantHash(), _fbxInfo.filePath())); + _geometry.reset(readFBX(fbxContents, QVariantHash(), _fbxInfo.filePath())); - // make sure we have some basic mappings - populateBasicMapping(_mapping, _fbxInfo.filePath(), *_geometry); + // make sure we have some basic mappings + populateBasicMapping(_mapping, _fbxInfo.filePath(), *_geometry); + } catch (const QString& error) { + qCDebug(interfaceapp) << "Error reading " << _fbxInfo.filePath() << ": " << error; + return false; + } return true; } diff --git a/libraries/fbx/src/FBXReader_Node.cpp b/libraries/fbx/src/FBXReader_Node.cpp index d5b606129a..a6fba5a4d5 100644 --- a/libraries/fbx/src/FBXReader_Node.cpp +++ b/libraries/fbx/src/FBXReader_Node.cpp @@ -47,6 +47,9 @@ template QVariant readBinaryArray(QDataStream& in, int& position) { in.readRawData(compressed.data() + sizeof(quint32), compressedLength); position += compressedLength; QByteArray uncompressed = qUncompress(compressed); + if (uncompressed.isEmpty()) { // answers empty byte array if corrupt + throw QString("corrupt fbx file"); + } QDataStream uncompressedIn(uncompressed); uncompressedIn.setByteOrder(QDataStream::LittleEndian); uncompressedIn.setVersion(QDataStream::Qt_4_5); // for single/double precision switch diff --git a/tools/vhacd-util/src/VHACDUtil.cpp b/tools/vhacd-util/src/VHACDUtil.cpp index d997f63e53..57ad185f45 100644 --- a/tools/vhacd-util/src/VHACDUtil.cpp +++ b/tools/vhacd-util/src/VHACDUtil.cpp @@ -34,20 +34,24 @@ bool vhacd::VHACDUtil::loadFBX(const QString filename, FBXGeometry& result) { return false; } std::cout << "Reading FBX.....\n"; + try { + QByteArray fbxContents = fbx.readAll(); + FBXGeometry* geom; + if (filename.toLower().endsWith(".obj")) { + geom = OBJReader().readOBJ(fbxContents, QVariantHash()); + } else if (filename.toLower().endsWith(".fbx")) { + geom = readFBX(fbxContents, QVariantHash(), filename); + } else { + qDebug() << "unknown file extension"; + return false; + } + result = *geom; - QByteArray fbxContents = fbx.readAll(); - FBXGeometry* geom; - if (filename.toLower().endsWith(".obj")) { - geom = OBJReader().readOBJ(fbxContents, QVariantHash()); - } else if (filename.toLower().endsWith(".fbx")) { - geom = readFBX(fbxContents, QVariantHash(), filename); - } else { - qDebug() << "unknown file extension"; + reSortFBXGeometryMeshes(result); + } catch (const QString& error) { + qDebug() << "Error reading " << filename << ": " << error; return false; } - result = *geom; - - reSortFBXGeometryMeshes(result); return true; }