Hello Anton, well, it turns out that there is no version 6.2.1, so I've added only the upstream patch to the package.
> OK, just push into git. Since I'm not (yet) in the debian-science group I don't have write access to the vtk6 packaging git. Therefore, I've attached the change set as a patch against the package source tree: > diffstat vtk6-6.2.0-dfsg1-6-fix-racecondition.patch changelog | 7 patches/96_concurrent_vtkLookupTableMapData_fix.patch | 198++ patches/series | 1 3 files changed, 206 insertions(+) -- The 96_ patch applies cleanly, and I'm test building now (right now at 50% well within the Tcl bindings). Best, Gert
commit 88349595a1410bbb8670fbd31550c38297f15b68 Author: Gert Wollny <[email protected]> Date: Sun Jan 31 17:40:33 2016 +0100 Add patch to fix race condition diff --git a/debian/changelog b/debian/changelog index f8003d3..e2927d0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +vtk6 (6.2.0+dfsg1-6.1) UNRELEASED; urgency=medium + + * Non-maintainer upload + * d/patched/96 Fix race condition in vtkLookupTableMapdata + + -- Gert Wollny <[email protected]> Sun, 31 Jan 2016 17:37:41 +0100 + vtk6 (6.2.0+dfsg1-6) unstable; urgency=medium * [18cd92a] Add missing libaec-dev to build-depends. diff --git a/debian/patches/96_concurrent_vtkLookupTableMapData_fix.patch b/debian/patches/96_concurrent_vtkLookupTableMapData_fix.patch new file mode 100644 index 0000000..242b2f3 --- /dev/null +++ b/debian/patches/96_concurrent_vtkLookupTableMapData_fix.patch @@ -0,0 +1,198 @@ +Description: Fix crash in function called from multiple threads + vtkLookupTableMapData() was not thread safe and could lead to + crashes when accessed from multiple threads. Added a mutex around + the logic to determine if the color table size needed to be + increased. + . + Added a multi-threaded test that crashes on occasion prior + to this patch, but does not crash with this patch applied. +Author: Cory Quammen <[email protected]> +Last-Update: 2016-01-31 +Bug: http://www.vtk.org/Bug/view.php?id=15365 + +diff --git a/Common/Core/Testing/Cxx/CMakeLists.txt b/Common/Core/Testing/Cxx/CMakeLists.txt +--- a/Common/Core/Testing/Cxx/CMakeLists.txt ++++ b/Common/Core/Testing/Cxx/CMakeLists.txt +@@ -32,6 +32,7 @@ vtk_add_test_cxx(${vtk-module}CxxTests tests + TestGarbageCollector.cxx + # TestInstantiator.cxx # Have not enabled instantiators. + TestLookupTable.cxx ++ TestLookupTableThreaded.cxx + TestMath.cxx + TestMinimalStandardRandomSequence.cxx + TestNew.cxx +diff --git a/Common/Core/Testing/Cxx/TestLookupTableThreaded.cxx b/Common/Core/Testing/Cxx/TestLookupTableThreaded.cxx +new file mode 100644 +index 0000000..4330609 +--- /dev/null ++++ b/Common/Core/Testing/Cxx/TestLookupTableThreaded.cxx +@@ -0,0 +1,57 @@ ++/*========================================================================= ++ ++ Program: Visualization Toolkit ++ Module: TestLookupTableThreaded.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 "vtkLookupTable.h" ++#include "vtkMultiThreader.h" ++#include "vtkNew.h" ++ ++namespace { ++ ++vtkLookupTable * lut; ++ ++VTK_THREAD_RETURN_TYPE ThreadedMethod(void *) ++{ ++ int numberOfValues = 25; ++ double* input = new double[numberOfValues]; ++ unsigned char* output = new unsigned char[4*numberOfValues]; ++ int inputType = VTK_DOUBLE; ++ int inputIncrement = 1; ++ int outputFormat = VTK_RGBA; ++ ++ lut->MapScalarsThroughTable2(input, output, inputType, numberOfValues, ++ inputIncrement, outputFormat); ++ ++ delete[] input; ++ delete[] output; ++ ++ return VTK_THREAD_RETURN_VALUE; ++} ++ ++} // end anonymous namespace ++ ++int TestLookupTableThreaded(int, char* []) ++{ ++ lut = vtkLookupTable::New(); ++ lut->SetNumberOfTableValues( 1024 ); ++ ++ vtkNew<vtkMultiThreader> threader; ++ threader->SetSingleMethod( ThreadedMethod, NULL ); ++ threader->SetNumberOfThreads( 4 ); ++ threader->SingleMethodExecute(); ++ ++ lut->Delete(); ++ ++ return EXIT_SUCCESS; ++} +diff --git a/Common/Core/vtkLookupTable.cxx b/Common/Core/vtkLookupTable.cxx +index 53d9663..2d90054 100644 +--- a/Common/Core/vtkLookupTable.cxx ++++ b/Common/Core/vtkLookupTable.cxx +@@ -18,6 +18,7 @@ + #include "vtkBitArray.h" + #include "vtkMath.h" + #include "vtkMathConfigure.h" ++#include "vtkMutexLock.h" + #include "vtkObjectFactory.h" + #include "vtkStringArray.h" + #include "vtkVariantArray.h" +@@ -81,6 +82,8 @@ vtkLookupTable::vtkLookupTable(int sze, int ext) + this->Scale = VTK_SCALE_LINEAR; + + this->OpaqueFlag=1; ++ ++ this->ResizeMutex = vtkSimpleMutexLock::New(); + } + + //---------------------------------------------------------------------------- +@@ -88,6 +91,7 @@ vtkLookupTable::~vtkLookupTable() + { + this->Table->UnRegister( this ); + this->Table = NULL; ++ this->ResizeMutex->Delete(); + } + + //---------------------------------------------------------------------------- +@@ -641,8 +645,8 @@ namespace { + + //---------------------------------------------------------------------------- + template<class T> +-void vtkLookupTableMapData(vtkLookupTable *self, T *input, +- unsigned char *output, int length, ++void vtkLookupTableMapData(vtkLookupTable *self, vtkSimpleMutexLock *mutex, ++ T *input, unsigned char *output, int length, + int inIncr, int outFormat, TableParameters & p) + { + int i = length; +@@ -654,14 +658,24 @@ void vtkLookupTableMapData(vtkLookupTable *self, T *input, + // end. When this function is called repeatedly with the same size + // lookup table, memory reallocation will be done only one the first + // call if at all. ++ + vtkUnsignedCharArray* lookupTable = self->GetTable(); + vtkIdType numberOfColors = lookupTable->GetNumberOfTuples(); + vtkIdType neededSize = (numberOfColors + vtkLookupTable::NUMBER_OF_SPECIAL_COLORS) * + lookupTable->GetNumberOfComponents(); ++ ++ // Since this involves a potential array resize and this function ++ // might be accessed concurently from more than one thread, we need a ++ // mutex here. This shouldn't affect performance much if this function ++ // is used to map many input values, but if it is called repeatedly ++ // with short input arrays, performance may be much worse. ++ mutex->Lock(); + if (lookupTable->GetSize() < neededSize) + { + lookupTable->Resize(numberOfColors + vtkLookupTable::NUMBER_OF_SPECIAL_COLORS); + } ++ mutex->Unlock(); ++ + unsigned char* table = lookupTable->GetPointer(0); + + // Writing directly to the memory location instead of adding them +@@ -1159,7 +1173,7 @@ void vtkLookupTable::MapScalarsThroughTable2(void *input, + { + newInput->SetValue(i, bitArray->GetValue(id)); + } +- vtkLookupTableMapData(this, ++ vtkLookupTableMapData(this, this->ResizeMutex, + static_cast<unsigned char*>(newInput->GetPointer(0)), + output, numberOfValues, + inputIncrement, outputFormat, p); +@@ -1169,7 +1183,7 @@ void vtkLookupTable::MapScalarsThroughTable2(void *input, + break; + + vtkTemplateMacro( +- vtkLookupTableMapData(this,static_cast<VTK_TT*>(input),output, ++ vtkLookupTableMapData(this, this->ResizeMutex, static_cast<VTK_TT*>(input),output, + numberOfValues, inputIncrement, outputFormat, p) + ); + default: +diff --git a/Common/Core/vtkLookupTable.h b/Common/Core/vtkLookupTable.h +index f233c85..d0401df 100644 +--- a/Common/Core/vtkLookupTable.h ++++ b/Common/Core/vtkLookupTable.h +@@ -56,6 +56,8 @@ + + #include "vtkUnsignedCharArray.h" // Needed for inline method + ++class vtkSimpleMutexLock; ++ + #define VTK_RAMP_LINEAR 0 + #define VTK_RAMP_SCURVE 1 + #define VTK_RAMP_SQRT 2 +@@ -359,6 +361,8 @@ protected: + int OpaqueFlag; + vtkTimeStamp OpaqueFlagBuildTime; + ++ vtkSimpleMutexLock* ResizeMutex; ++ + private: + vtkLookupTable(const vtkLookupTable&); // Not implemented. + void operator=(const vtkLookupTable&); // Not implemented. +@@ -373,6 +377,3 @@ inline unsigned char *vtkLookupTable::WritePointer(const vtkIdType id, + } + + #endif +- +- +- diff --git a/debian/patches/series b/debian/patches/series index 23a2c92..9582b3a 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -8,3 +8,4 @@ 80_fix_arm_compilation.patch 90_gdal-2.0.patch 95_ffmpeg_2.9.patch +96_concurrent_vtkLookupTableMapData_fix.patch
-- debian-science-maintainers mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-science-maintainers
