Report out-of-memory in some loading places
BTG can throw bad-alloc in the wild; catch this case and report it.
This commit is contained in:
parent
b585df04a5
commit
84a569913d
@ -557,7 +557,13 @@ ModelRegistry::readImage(const string& fileName,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
res = registry->readImageImplementation(absFileName, opt);
|
res = registry->readImageImplementation(absFileName, opt);
|
||||||
|
} catch (std::bad_alloc&) {
|
||||||
|
simgear::reportFailure(simgear::LoadFailure::OutOfMemory, simgear::ErrorCode::ThreeDModelLoad,
|
||||||
|
"Out of memory loading texture", sg_location{absFileName});
|
||||||
|
return ReaderWriter::ReadResult::INSUFFICIENT_MEMORY_TO_LOAD;
|
||||||
|
}
|
||||||
|
|
||||||
if (!res.success()) {
|
if (!res.success()) {
|
||||||
SG_LOG(SG_IO, SG_DEV_WARN, "Image loading failed:" << res.message());
|
SG_LOG(SG_IO, SG_DEV_WARN, "Image loading failed:" << res.message());
|
||||||
@ -733,7 +739,6 @@ ModelRegistry::readNode(const string& fileName,
|
|||||||
ec.addFromMap(sgopt->getErrorContext());
|
ec.addFromMap(sgopt->getErrorContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
ReaderWriter::ReadResult res;
|
|
||||||
CallbackMap::iterator iter
|
CallbackMap::iterator iter
|
||||||
= nodeCallbackMap.find(getFileExtension(fileName));
|
= nodeCallbackMap.find(getFileExtension(fileName));
|
||||||
ReaderWriter::ReadResult result;
|
ReaderWriter::ReadResult result;
|
||||||
@ -742,6 +747,11 @@ ModelRegistry::readNode(const string& fileName,
|
|||||||
else
|
else
|
||||||
result = _defaultCallback->readNode(fileName, opt);
|
result = _defaultCallback->readNode(fileName, opt);
|
||||||
|
|
||||||
|
if (!result.validNode()) {
|
||||||
|
simgear::reportFailure(simgear::LoadFailure::BadData, simgear::ErrorCode::ThreeDModelLoad,
|
||||||
|
"Failed to load 3D model:" + result.message(), sg_location{fileName});
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,6 +73,10 @@ SGReaderWriterBTG::readNode(const std::string& fileName,
|
|||||||
"Failed to load BTG file:" + e.getFormattedMessage(),
|
"Failed to load BTG file:" + e.getFormattedMessage(),
|
||||||
e.getLocation());
|
e.getLocation());
|
||||||
return ReadResult::ERROR_IN_READING_FILE;
|
return ReadResult::ERROR_IN_READING_FILE;
|
||||||
|
} catch (std::bad_alloc&) {
|
||||||
|
simgear::reportFailure(simgear::LoadFailure::OutOfMemory, simgear::ErrorCode::BTGLoad,
|
||||||
|
"Out of memory loading BTG:" + fileName, sg_location{fileName});
|
||||||
|
return ReadResult::ERROR_IN_READING_FILE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
Loading…
Reference in New Issue
Block a user