From 0f4cd568f6b5fe91407783ff610bfc9b5d1ced13 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 8 Feb 2007 10:46:58 +0000 Subject: [PATCH] From Donn Mielcarek, "We generated some bad ive files in our database. In some of the files, the function readInt() would return a 0 size. While linux will happily continue on, creating 0 sized arrays, Windows immediately blows up, with sparks sometimes flying out the side of the machine! I added a simple check for zero size in each of the functions that allocates arrays based on the size variable, and I thought I'd pass it along. Now the program will not die if it encounters an ive file with bad data." --- src/osgPlugins/ive/DataInputStream.cpp | 33 ++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/osgPlugins/ive/DataInputStream.cpp b/src/osgPlugins/ive/DataInputStream.cpp index ead060e6a..9c8092c41 100644 --- a/src/osgPlugins/ive/DataInputStream.cpp +++ b/src/osgPlugins/ive/DataInputStream.cpp @@ -295,6 +295,8 @@ double DataInputStream::readDouble(){ std::string DataInputStream::readString(){ std::string s; int size = readInt(); + if (size == 0) + return NULL; s.resize(size); _istream->read((char*)s.c_str(), size); //if (_istream->rdstate() & _istream->failbit) @@ -472,6 +474,8 @@ osg::Array* DataInputStream::readArray(){ osg::IntArray* DataInputStream::readIntArray() { int size = readInt(); + if (size == 0) + return NULL; osg::IntArray* a = new osg::IntArray(size); _istream->read((char*)&((*a)[0]), INTSIZE*size); @@ -491,6 +495,8 @@ osg::IntArray* DataInputStream::readIntArray() osg::UByteArray* DataInputStream::readUByteArray() { int size = readInt(); + if (size == 0) + return NULL; osg::UByteArray* a = new osg::UByteArray(size); _istream->read((char*)&((*a)[0]), CHARSIZE*size); @@ -506,6 +512,8 @@ osg::UByteArray* DataInputStream::readUByteArray() osg::UShortArray* DataInputStream::readUShortArray() { int size = readInt(); + if (size == 0) + return NULL; osg::UShortArray* a = new osg::UShortArray(size); _istream->read((char*)&((*a)[0]), SHORTSIZE*size); @@ -526,6 +534,8 @@ osg::UShortArray* DataInputStream::readUShortArray() osg::UIntArray* DataInputStream::readUIntArray() { int size = readInt(); + if (size == 0) + return NULL; osg::UIntArray* a = new osg::UIntArray(size); _istream->read((char*)&((*a)[0]), INTSIZE*size); @@ -546,6 +556,8 @@ osg::UIntArray* DataInputStream::readUIntArray() osg::Vec4ubArray* DataInputStream::readVec4ubArray() { int size = readInt(); + if (size == 0) + return NULL; osg::Vec4ubArray* a = new osg::Vec4ubArray(size); _istream->read((char*)&((*a)[0]), INTSIZE*size); @@ -561,6 +573,8 @@ osg::Vec4ubArray* DataInputStream::readVec4ubArray() osg::FloatArray* DataInputStream::readFloatArray() { int size = readInt(); + if (size == 0) + return NULL; osg::FloatArray* a = new osg::FloatArray(size); @@ -582,6 +596,9 @@ osg::FloatArray* DataInputStream::readFloatArray() osg::Vec2Array* DataInputStream::readVec2Array() { int size = readInt(); + if (size == 0) + return NULL; + osg::Vec2Array* a = new osg::Vec2Array(size); _istream->read((char*)&((*a)[0]), FLOATSIZE*2*size); @@ -605,6 +622,8 @@ osg::Vec2Array* DataInputStream::readVec2Array() osg::Vec3Array* DataInputStream::readVec3Array() { int size = readInt(); + if (size == 0) + return NULL; osg::Vec3Array* a = new osg::Vec3Array(size); _istream->read((char*)&((*a)[0]), FLOATSIZE*3*size); @@ -628,6 +647,8 @@ osg::Vec3Array* DataInputStream::readVec3Array() osg::Vec4Array* DataInputStream::readVec4Array(){ int size = readInt(); + if (size == 0) + return NULL; osg::Vec4Array* a = new osg::Vec4Array(size); _istream->read((char*)&((*a)[0]), FLOATSIZE*4*size); @@ -649,6 +670,8 @@ osg::Vec4Array* DataInputStream::readVec4Array(){ osg::Vec2bArray* DataInputStream::readVec2bArray() { int size = readInt(); + if (size == 0) + return NULL; osg::Vec2bArray* a = new osg::Vec2bArray(size); _istream->read((char*)&((*a)[0]), CHARSIZE * 2 * size); @@ -664,6 +687,8 @@ osg::Vec2bArray* DataInputStream::readVec2bArray() osg::Vec3bArray* DataInputStream::readVec3bArray() { int size = readInt(); + if (size == 0) + return NULL; osg::Vec3bArray* a = new osg::Vec3bArray(size); _istream->read((char*)&((*a)[0]), CHARSIZE * 3 * size); @@ -679,6 +704,8 @@ osg::Vec3bArray* DataInputStream::readVec3bArray() osg::Vec4bArray* DataInputStream::readVec4bArray() { int size = readInt(); + if (size == 0) + return NULL; osg::Vec4bArray* a = new osg::Vec4bArray(size); _istream->read((char*)&((*a)[0]), CHARSIZE * 4 * size); @@ -694,6 +721,8 @@ osg::Vec4bArray* DataInputStream::readVec4bArray() osg::Vec2sArray* DataInputStream::readVec2sArray() { int size = readInt(); + if (size == 0) + return NULL; osg::Vec2sArray* a = new osg::Vec2sArray(size); _istream->read((char*)&((*a)[0]), SHORTSIZE * 2 * size); @@ -718,6 +747,8 @@ osg::Vec2sArray* DataInputStream::readVec2sArray() osg::Vec3sArray* DataInputStream::readVec3sArray() { int size = readInt(); + if (size == 0) + return NULL; osg::Vec3sArray* a = new osg::Vec3sArray(size); _istream->read((char*)&((*a)[0]), SHORTSIZE * 3 * size); @@ -743,6 +774,8 @@ osg::Vec3sArray* DataInputStream::readVec3sArray() osg::Vec4sArray* DataInputStream::readVec4sArray() { int size = readInt(); + if (size == 0) + return NULL; osg::Vec4sArray* a = new osg::Vec4sArray(size); _istream->read((char*)&((*a)[0]), SHORTSIZE * 4 * size);