[vtk-developers] Memory Bug in vtkDataArray
    Daniel Aguilera 
    daniel.aguilera at cea.fr
       
    Mon Jan 29 08:26:35 EST 2007
    
    
  
Hi all,
 
I found (and fix) a very dangerous memory bug in vtkDataArray :
 
In the two non template methods InterpolateTuple the two calls to
vtkTemplateMacro :
 
In vtkDataArray : 301
      vtkTemplateMacro(
        void* vfrom = fromData->GetVoidPointer(0);
        void* vto = this->WriteVoidPointer(idx, numComp);
        .
 
In vtkDataArray : 367
    vtkTemplateMacro(
      void* vfrom1 = fromData1->GetVoidPointer(id1*numComp);
      void* vfrom2 = fromData2->GetVoidPointer(id2*numComp);
      void* vto = this->WriteVoidPointer(loc, numComp);
       .
 
are erroneous (cause segmentation fault) when 'fromData' and 'this' are the
same. vfrom* pointers are retrieved BEFORE the call to WriteVoidPointer,
which may THEN reallocate the array, making vfrom* pointers no longer valid.
 
To avoid any memory fault, it MUST be written this way (vfrom retrieved
AFTER call to WriteVoidPointer) :
In vtkDataArray : 301
      vtkTemplateMacro(
        void* vto = this->WriteVoidPointer(idx, numComp);
        void* vfrom = fromData->GetVoidPointer(0);
        .
 
In vtkDataArray : 367
    vtkTemplateMacro(
      void* vto = this->WriteVoidPointer(loc, numComp);
       void* vfrom1 = fromData1->GetVoidPointer(id1*numComp);
      void* vfrom2 = fromData2->GetVoidPointer(id2*numComp);
      .
 
#########################################################
 
This kind of call happens when the method RequestData (in file
vtkClipDataSet at line 378) calls :
    cell->Clip(this->Value, cellScalars, this->Locator, conn[0],
               inPD, outPD, inCD, cellId, outCD[0], this->InsideOut);
 
Then in vtkCell3D.cxx line 310 :
        // VERY IMPORTANT: Notice that the outPD is used twice. This is
because the
        // tetra has been defined in terms of point ids that are defined in
the
        // output (because of the templates).
        this->ClipTetra->Clip(value, this->ClipScalars, locator, tets,
outPD,
                              outPD, inCD, cellId, outCD, insideOut);
 
And finally in vtkTetra.cxx line 909:
        outPD->InterpolateEdge(inPD,pts[i-1],p1,p2,t);
 
Where outPD == inPD, making vtkDataArray InterpolateTuple crash later.
 
Best Regards
Daniel Aguilera
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtk-developers/attachments/20070129/68e07171/attachment.html>
    
    
More information about the vtk-developers
mailing list