[vtkusers] "Annoyance" in vtkDataReader using .NET2005

Mathieu Malaterre mathieu.malaterre at kitware.com
Mon Apr 24 12:38:59 EDT 2006


Bernd,

	Thanks for the report. Could you please open a bug report for that:

	http://vtk.org/Bug

Thanks
Mathieu

Hentschel, Bernd wrote:
> Dear VTK users,
> 
> I just discovered something I would call a major annoyance in the
> vtkDataReader because it isn't exactly a bug. We use vtkReader/Writer
> classes to (de)serialize vtk data via the WriteToOutputString feature.
> We recently switched our development to the new VC8 (aka .NET 2005)
> compilers and that's when the following issue with vtkDataReader arose:
> Trying to read an "empty" VTK-File (either file or string input), i.e.
> the representation of an empty vtkPolyData object (no points, no cells,
> just the header), our app crashed inside the read operation. The reason
> for this seems to be the "new" STL-implementation shipped with .NET2005.
> A lot of calls there are using assertions to ensure proper input
> parameters. In particular istream::read(*readbuffer,numbytes) now
> asserts that the input read pointer be != NULL. This caused the crash
> mentioned above, since eventually a NULL pointer is passed to read (in
> template <class T> int vtkReadBinaryData(istream *IS, T *data, int
> numTuples, int numComp)). 
> In the "old" STL implementation this was no problem. A NULL-pointer was
> only passed to calls which didn't read anything from the istream either,
> so in effect nothing was read. We fixed this issue by introducing a
> sanity check into vtkReadBinaryData in vtkDataReader.cxx, resulting in
> the following code:
> <<<<<
> template <class T>
> int vtkReadBinaryData(istream *IS, T *data, int numTuples, int numComp)
> {
>   //SANITY CHECK TO PREVENT READING NONSENSE
>   if(!data || numComp*numTuples == 0)
>   {
>     vtkGenericWarningMacro(<<"Invalid input data for binary read
> operation!");
>     return 0;
>   }  
>   
>   char line[256];
>   // suck up newline
>   IS->getline(line,256);
>   IS->read((char *)data, sizeof(T)*numComp*numTuples);  
>   if (IS->eof())
>     {
>     vtkGenericWarningMacro(<<"Error reading binary data!");
>     return 0;
>     }
>   return 1;
> }
> 
> We had this problem using 4.2.6 but looking at the source code and the
> cvs logs it doesn't seem to be fixed in vtk5 yet. I don't know for sure
> if the above fix is appropriate but it suffices our needs. So I thought
> I might share this one since it was a bit of a headache to figure out.
> 
> Regards,
> 	Bernd
> 




More information about the vtkusers mailing list