View Issue Details [ Jump to Notes ] | [ Print ] | ||||||||
ID | Project | Category | View Status | Date Submitted | Last Update | ||||
0000391 | VTK | (No Category) | public | 2003-11-20 14:08 | 2011-01-13 17:00 | ||||
Reporter | Luca Antiga | ||||||||
Assigned To | Mathieu Malaterre | ||||||||
Priority | normal | Severity | major | Reproducibility | always | ||||
Status | closed | Resolution | fixed | ||||||
Platform | OS | OS Version | |||||||
Product Version | |||||||||
Target Version | Fixed in Version | ||||||||
Summary | 0000391: vtkOBBTree crashes with non-polydata datasets due to unsafe pointer cast. | ||||||||
Description | This 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 :-) | ||||||||
Tags | No tags attached. | ||||||||
Project | |||||||||
Type | |||||||||
Attached Files | OBBTree.tcl [^] (1,674 bytes) 1969-12-31 19:00 | ||||||||
Relationships | |
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. |
Notes |
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) |
Issue History |
Copyright © 2000 - 2018 MantisBT Team |