View Issue Details Jump to Notes ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0000391VTK(No Category)public2003-11-20 14:082011-01-13 17:00
ReporterLuca Antiga 
Assigned ToMathieu Malaterre 
PrioritynormalSeveritymajorReproducibilityalways
StatusclosedResolutionfixed 
PlatformOSOS Version
Product Version 
Target VersionFixed in Version 
Summary0000391: vtkOBBTree crashes with non-polydata datasets due to unsafe pointer cast.
DescriptionThis line in vtkOBBTree::ComputeOBB(vtkIdList*,...)
...
((vtkPolyData *)this->DataSet)->GetCellPoints( cellId, numPts, ptIds );
...
causes obbtree to crash with e.g. unstructured grid datasets.
(Short term) fixes:
1. The line should be replaced by:
vtkPolyData *polydata;
polydata = vtkPolyData::SafeDownCast(this->DataSet);
if (polydata == NULL)
{
  vtkErrorMacro(<< "Input dataset not vtkPolyData");
  return;
}
polydata->GetCellPoints( cellId, numPts, ptIds );
2. The limitation should be documented.
3. Alternatively, the method vtkOBBTree::SetDataSet(vtkPolyData *) should be defined thus preventing the user from calling the base class method (using the C++ no-overloading-across-scopes feature).
(Longer term) fixes:
1. Modify the locator to use the vtkOBBTree::ComputeOBB(vtkPoints*,...) when the input is not polydata.
2. Wait for vtkMesh :-)
TagsNo tags attached.
Project
Type
Attached Files? file icon OBBTree.tcl [^] (1,674 bytes) 1969-12-31 19:00

 Relationships

  Notes
(0000538)
Mathieu Malaterre (developer)
2004-01-21 17:28

Could reproduce the bug:

(gdb) r OBBTree.tcl
Starting program: /home/malaterre/Kitware/VTKBin/bin/vtk OBBTree.tcl
[Thread debugging using libthread_db enabled]
[New Thread -1084802752 (LWP 20399)]
 
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1084802752 (LWP 20399)]
0x00c4dfb4 in vtkDataArrayTemplate<int>::GetValue(int) (this=0x909db20, id=0) at vtkDataArrayTemplate.h:85
85 T GetValue(vtkIdType id) { return this->Array[id]; }
(gdb) bt
#0 0x00c4dfb4 in vtkDataArrayTemplate<int>::GetValue(int) (this=0x909db20, id=0) at vtkDataArrayTemplate.h:85
#1 0x00c4df35 in vtkIntArray::GetValue(int) (this=0x909db20, id=0) at vtkIntArray.h:50
#2 0x00c4ddfe in vtkCellTypes::GetCellLocation(int) (this=0x909d968, cellId=0) at vtkCellTypes.h:66
#3 0x0149faa1 in vtkPolyData::GetCellPoints(int, int&, int*&) (this=0x9091eb0, cellId=0, npts=@0xbff288f0, pts=@0xbff288f4)
    at /home/malaterre/Kitware/VTK/Common/vtkPolyData.cxx:1026
#4 0x03fa9492 in vtkOBBTree::ComputeOBB(vtkIdList*, double*, double*, double*, double*, double*) (this=0x90b0f68, cells=0x90b8e10, corner=0x90b8e38,
    max=0x90b8e50, mid=0x90b8e68, min=0x90b8e80, size=0xbff28a50) at /home/malaterre/Kitware/VTK/Graphics/vtkOBBTree.cxx:296
#5 0x03fabd8f in vtkOBBTree::BuildTree(vtkIdList*, vtkOBBNode*, int) (this=0x90b0f68, cells=0x90b8e10, OBBptr=0x90b8e38, level=0)
    at /home/malaterre/Kitware/VTK/Graphics/vtkOBBTree.cxx:1139
#6 0x03fab9e6 in vtkOBBTree::BuildLocator() (this=0x90b0f68) at /home/malaterre/Kitware/VTK/Graphics/vtkOBBTree.cxx:1097
#7 0x01450aa8 in vtkLocator::Update() (this=0x90b0f68) at /home/malaterre/Kitware/VTK/Common/vtkLocator.cxx:58
#8 0x04013875 in vtkSpatialRepresentationFilter::Execute() (this=0x90b1368) at /home/malaterre/Kitware/VTK/Graphics/vtkSpatialRepresentationFilter.cxx:93
0000009 0x014d5ec3 in vtkSource::ExecuteData(vtkDataObject*) (this=0x90b1368, output=0x90b13d8) at /home/malaterre/Kitware/VTK/Common/vtkSource.cxx:498
#10 0x014d5aea in vtkSource::UpdateData(vtkDataObject*) (this=0x90b1368, output=0x90b13d8) at /home/malaterre/Kitware/VTK/Common/vtkSource.cxx:408
0000011 0x013eca09 in vtkDataObject::UpdateData() (this=0x90b13d8) at /home/malaterre/Kitware/VTK/Common/vtkDataObject.cxx:352
#12 0x013ec723 in vtkDataObject::Update() (this=0x90b13d8) at /home/malaterre/Kitware/VTK/Common/vtkDataObject.cxx:251
#13 0x010bce67 in vtkMapper::Update() (this=0x90af378) at /home/malaterre/Kitware/VTK/Rendering/vtkMapper.cxx:362
#14 0x010cad85 in vtkPolyDataMapper::Update() (this=0x90af378) at /home/malaterre/Kitware/VTK/Rendering/vtkPolyDataMapper.cxx:102
#15 0x010cadd2 in vtkPolyDataMapper::GetBounds() (this=0x90af378) at /home/malaterre/Kitware/VTK/Rendering/vtkPolyDataMapper.cxx:117
#16 0x010445bd in vtkActor::GetBounds() (this=0x90af850) at /home/malaterre/Kitware/VTK/Rendering/vtkActor.cxx:318
#17 0x010e8eec in vtkRenderer::ComputeVisiblePropBounds(double*) (this=0x90b15a8, allBounds=0xbff28ec0)
    at /home/malaterre/Kitware/VTK/Rendering/vtkRenderer.cxx:632
#18 0x010e9207 in vtkRenderer::ResetCamera() (this=0x90b15a8) at /home/malaterre/Kitware/VTK/Rendering/vtkRenderer.cxx:688
#19 0x010e8ab4 in vtkRenderer::GetActiveCamera() (this=0x90b15a8) at /home/malaterre/Kitware/VTK/Rendering/vtkRenderer.cxx:519
#20 0x00ad73ee in vtkRendererCppCommand(vtkRenderer*, Tcl_Interp*, int, char**) (op=0x90b15a8, interp=0x8f7f7a0, argc=2, argv=0xbff29c30)
    at /home/malaterre/Kitware/VTKBin/Rendering/vtkRendererTcl.cxx:474
#21 0x00b0307a in vtkOpenGLRendererCppCommand(vtkOpenGLRenderer*, Tcl_Interp*, int, char**) (op=0x90b15a8, interp=0x8f7f7a0, argc=2, argv=0xbff29c30)
    at /home/malaterre/Kitware/VTKBin/Rendering/vtkOpenGLRendererTcl.cxx:219
#22 0x00b0297c in vtkOpenGLRendererCommand(void*, Tcl_Interp*, int, char**) (cd=0x90b1b08, interp=0x8f7f7a0, argc=2, argv=0xbff29c30)
    at /home/malaterre/Kitware/VTKBin/Rendering/vtkOpenGLRendererTcl.cxx:28
#23 0x076c381b in TclInvokeStringCommand () from /usr/lib/libtcl8.3.so
#24 0x076ff1ea in TclExpandTokenArray () from /usr/lib/libtcl8.3.so
#25 0x076ff8d3 in Tcl_EvalEx () from /usr/lib/libtcl8.3.so
#26 0x076ff516 in Tcl_EvalTokens () from /usr/lib/libtcl8.3.so
#27 0x076ff85c in Tcl_EvalEx () from /usr/lib/libtcl8.3.so
#28 0x076f5d0a in Tcl_EvalFile () from /usr/lib/libtcl8.3.so
#29 0x00b6b739 in Tk_MainEx () from /usr/lib/libtk8.3.so
#30 0x08049704 in main (argc=2, argv=0xbff2a654) at /home/malaterre/Kitware/VTK/Wrapping/Tcl/vtkTkAppInit.cxx:151
(gdb) The program is running. Exit anyway? (y or n)
(0000541)
Mathieu Malaterre (developer)
2004-01-21 18:26

Luca, what do you think of this patch:

Index: vtkOBBTree.cxx
===================================================================
RCS file: /cvsroot/VTK/VTK/Graphics/vtkOBBTree.cxx,v
retrieving revision 1.55
diff -u -3 -p -r1.55 vtkOBBTree.cxx
--- vtkOBBTree.cxx 5 Dec 2003 18:19:41 -0000 1.55
+++ vtkOBBTree.cxx 21 Jan 2004 23:24:28 -0000
@@ -24,6 +24,7 @@
 #include "vtkPolyData.h"
 #include "vtkPolygon.h"
 #include "vtkTriangle.h"
+#include "vtkUnstructuredGrid.h"
  
 vtkCxxRevisionMacro(vtkOBBTree, "$Revision: 1.55 $");
 vtkStandardNewMacro(vtkOBBTree);
@@ -293,7 +294,15 @@ void vtkOBBTree::ComputeOBB(vtkIdList *c
     {
     cellId = cells->GetId( i );
     type = this->DataSet->GetCellType( cellId );
- ((vtkPolyData *)this->DataSet)->GetCellPoints( cellId, numPts, ptIds );
+ switch (this->DataSet->GetDataObjectType())
+ {
+ case VTK_POLY_DATA:
+ ((vtkPolyData *)this->DataSet)->GetCellPoints( cellId, numPts, ptIds );
+ break;
+ case VTK_UNSTRUCTURED_GRID:
+ ((vtkUnstructuredGrid *)this->DataSet)->GetCellPoints( cellId, numPts, ptIds );
+ break;
+ }
     for ( j=0; j<numPts-2; j++ )
       {
       vtkCELLTRIANGLES( ptIds, type, j, pId, qId, rId );
(0000555)
Mathieu Malaterre (developer)
2004-01-22 09:43

Fixed in CVS on 01/22:
http://vtk.org/cgi-bin/cvsweb.cgi/VTK/Graphics/vtkOBBTree.cxx.diff?r1=1.55&r2=1.56 [^]
(0000556)
Mathieu Malaterre (developer)
2004-01-22 09:49

I suggest we closed this bug.

 Issue History
Date Modified Username Field Change
2010-11-29 17:59 Mathieu Malaterre Source_changeset_attached => VTK master 985d7cf4
2011-01-13 17:00 Source_changeset_attached => VTK master a2bd8391
2011-01-13 17:00 Source_changeset_attached => VTK master 020ef709
2011-06-16 13:11 Zack Galbreath Category => (No Category)


Copyright © 2000 - 2018 MantisBT Team