Commit b47332bb authored by Shawn Waldon's avatar Shawn Waldon
Browse files

Fixed reference counting bug in vtkTransform

There was a reference counting error in vtkTransformConcatenation when
a transform was DeepCopy'ed and shortened and then DeepCopy'ed and lengthened
using some of the same concatenated transforms.

When the list of concatenated transforms was shortened, the values
were not cleared out, letting pointers in the list that did not have a reference
according to the reference counting.  Later, when the list was set to a larger
list again and happenned to have the same transform at postion x, since there
was already a reference to the transform in the list, it did not increment
the reference count even though it should have.  This commit fixes this
by setting pointers beyond the end of the list to NULL when DeepCopy shrinks the list.

This commit also adds a regression test for that will segfault unless the
bug is fixed due to a reference count that is accidentally decremented in
a loop due to the bug. Running this test without this patch will segfault.

Change-Id: I27d7c2097f85a2f8c1d6e8a0e8213d041cc83125
parent 1fb3bd99
vtk_add_test_cxx(NO_DATA NO_VALID NO_OUTPUT
TestTransform.cxx
)
vtk_test_cxx_executable(${vtk-module}CxxTests)
/*=========================================================================
Program: Visualization Toolkit
Module: TestTransform.cxx
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include <iostream>
#include "vtkTransform.h"
#include "vtkSmartPointer.h"
// forward declare test subroutines
int testUseOfInverse();
int TestTransform(int,char *[])
{
int numErrors = 0;
numErrors += testUseOfInverse();
return (numErrors > 0) ? 1 : 0;
}
// This is a regression test for a bug where th following code produced
// a segfault. As long as this code does not produce a segfault,
// consider it to have passed the test.
int testUseOfInverse()
{
vtkSmartPointer<vtkTransform> trans1 =
vtkSmartPointer<vtkTransform>::New();
vtkSmartPointer<vtkTransform> trans2 =
vtkSmartPointer<vtkTransform>::New();
vtkSmartPointer<vtkTransform> trans3 =
vtkSmartPointer<vtkTransform>::New();
trans1->Identity();
trans2->Identity();
trans2->PostMultiply();
trans3->Identity();
double a[] = {3,4,5}, b[3];
// get inverses for 2 and 3
vtkSmartPointer<vtkLinearTransform> inv2 =
trans2->GetLinearInverse();
vtkSmartPointer<vtkLinearTransform> inv3 =
trans3->GetLinearInverse();
for (int i = 0; i < 30; i++)
{
// make the transform something easy
trans2->Translate(a);
trans2->RotateX(4);
trans2->RotateY(i % 90);
// transform some stuff
inv2->TransformVector(a,b);
inv2->TransformPoint(a,b);
// build a transform with concatenations including an inverse
trans2->Identity();
trans2->Concatenate(trans1);
trans2->Concatenate(inv3);
// transform some stuff
inv2->TransformVector(a,b);
inv2->TransformPoint(a,b);
// print i
trans2->Identity();
std::cout << "Iteration: " << i << " Reference Count: "
<< inv3->GetReferenceCount() << std::endl;
}
return 0;
}
......@@ -7,4 +7,6 @@ vtk_module(vtkCommonTransforms
# of vtkCommonMath off but still satisfy API dependcy.
vtkCommonCore
vtkCommonMath
TEST_DEPENDS
vtkTestingCore
)
......@@ -866,10 +866,12 @@ void vtkTransformConcatenation::DeepCopy(vtkTransformConcatenation *concat)
if (this->TransformList[i].ForwardTransform)
{
this->TransformList[i].ForwardTransform->Delete();
this->TransformList[i].ForwardTransform = NULL;
}
if (this->TransformList[i].InverseTransform)
{
this->TransformList[i].InverseTransform->Delete();
this->TransformList[i].InverseTransform = NULL;
}
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment