aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction
diff options
context:
space:
mode:
authorNicola Mettifogo2009-03-22 15:30:42 +0000
committerNicola Mettifogo2009-03-22 15:30:42 +0000
commit2b8140d7658705a6f032e6d7969de2505fda88ab (patch)
treef58656eb08a76fa89be289363d5c0950a957e26f /engines/parallaction
parent631e0aaed554fda923da020ffd0e6f9b18234ef9 (diff)
downloadscummvm-rg350-2b8140d7658705a6f032e6d7969de2505fda88ab.tar.gz
scummvm-rg350-2b8140d7658705a6f032e6d7969de2505fda88ab.tar.bz2
scummvm-rg350-2b8140d7658705a6f032e6d7969de2505fda88ab.zip
Added simple IFF type verification to the parser.
svn-id: r39609
Diffstat (limited to 'engines/parallaction')
-rw-r--r--engines/parallaction/iff.cpp36
-rw-r--r--engines/parallaction/iff.h7
2 files changed, 31 insertions, 12 deletions
diff --git a/engines/parallaction/iff.cpp b/engines/parallaction/iff.cpp
index c48b12f888..8f8ba0a838 100644
--- a/engines/parallaction/iff.cpp
+++ b/engines/parallaction/iff.cpp
@@ -39,6 +39,22 @@ void IFFParser::setInputStream(Common::SeekableReadStream *stream) {
_stream = stream;
_startOffset = 0;
_endOffset = _stream->size();
+
+ _formType = 0;
+ _formSize = (uint32)-1;
+
+ if (_stream->size() < 12) {
+ // this file is too small to be a valid IFF container
+ return;
+ }
+
+ if (_stream->readUint32BE() != ID_FORM) {
+ // no FORM header was found
+ return;
+ }
+
+ _formSize = _stream->readUint32BE();
+ _formType = _stream->readUint32BE();
}
void IFFParser::destroy() {
@@ -46,18 +62,12 @@ void IFFParser::destroy() {
_startOffset = _endOffset = 0;
}
-uint32 IFFParser::getFORMBlockSize() {
- uint32 oldOffset = _stream->pos();
-
- uint32 data = _stream->readUint32BE();
-
- if (data != ID_FORM) {
- _stream->seek(oldOffset);
- return (uint32)-1;
- }
+uint32 IFFParser::getFORMSize() const {
+ return _formSize;
+}
- data = _stream->readUint32BE();
- return data;
+Common::IFF_ID IFFParser::getFORMType() const {
+ return _formType;
}
uint32 IFFParser::moveToIFFBlock(Common::IFF_ID chunkName) {
@@ -117,6 +127,10 @@ ILBMDecoder::ILBMDecoder(Common::SeekableReadStream *in, bool disposeStream) : _
assert(in);
_parser.setInputStream(in);
+ if (_parser.getFORMType() != ID_ILBM) {
+ return;
+ }
+
_hasHeader = _parser.loadIFFBlock(ID_BMHD, &_header, sizeof(_header));
if (!_hasHeader) {
return;
diff --git a/engines/parallaction/iff.h b/engines/parallaction/iff.h
index 6edd28a17f..43f78bf001 100644
--- a/engines/parallaction/iff.h
+++ b/engines/parallaction/iff.h
@@ -46,7 +46,9 @@ public:
operator bool() const { return (_startOffset != _endOffset) && _stream; }
- uint32 getFORMBlockSize();
+ uint32 getFORMSize() const;
+ Common::IFF_ID getFORMType() const;
+
uint32 getIFFBlockSize(Common::IFF_ID chunk);
bool loadIFFBlock(Common::IFF_ID chunk, void *loadTo, uint32 ptrSize);
Common::SeekableReadStream *getIFFBlockStream(Common::IFF_ID chunkName);
@@ -57,6 +59,9 @@ private:
Common::SeekableReadStream *_stream;
uint32 _startOffset;
uint32 _endOffset;
+
+ uint32 _formSize;
+ Common::IFF_ID _formType;
};