Skip to content

Commit 7cbbc7c

Browse files
committed
TPC dEdx: Fix memory cooruption from owning pointer leaked into subobject
1 parent ad6c686 commit 7cbbc7c

2 files changed

Lines changed: 10 additions & 6 deletions

File tree

GPU/GPUTracking/DataTypes/CalibdEdxContainer.cxx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,19 @@ void CalibdEdxContainer::cloneFromObject(const CalibdEdxContainer& obj, char* ne
3636
mApplyFullGainMap = obj.mApplyFullGainMap;
3737
mCalibsLoad = obj.mCalibsLoad;
3838
if (obj.mCalibTrackTopologyPol) {
39-
cloneFromObject(mCalibTrackTopologyPol, obj.mCalibTrackTopologyPol, newFlatBufferPtr, oldFlatBufferPtr);
39+
subobjectCloneFromObject(mCalibTrackTopologyPol, obj.mCalibTrackTopologyPol);
4040
}
4141
if (obj.mCalibTrackTopologySpline) {
42-
cloneFromObject(mCalibTrackTopologySpline, obj.mCalibTrackTopologySpline, newFlatBufferPtr, oldFlatBufferPtr);
42+
subobjectCloneFromObject(mCalibTrackTopologySpline, obj.mCalibTrackTopologySpline);
4343
}
4444
}
4545

4646
template <class Type>
47-
void CalibdEdxContainer::cloneFromObject(Type*& obj, const Type* objOld, char* newFlatBufferPtr, const char* oldFlatBufferPtr)
47+
void CalibdEdxContainer::subobjectCloneFromObject(Type*& obj, const Type* objOld)
4848
{
49-
obj = FlatObject::relocatePointer(oldFlatBufferPtr, mFlatBufferPtr, objOld);
50-
obj->cloneFromObject(*objOld, newFlatBufferPtr);
49+
obj = reinterpret_cast<Type*>(mFlatBufferPtr);
50+
memset((void*)obj, 0, sizeof(*obj));
51+
obj->cloneFromObject(*objOld, mFlatBufferPtr + sizeOfCalibdEdxTrackTopologyObj<Type>());
5152
}
5253
#endif
5354

@@ -157,18 +158,21 @@ void CalibdEdxContainer::loadSplineTopologyCorrectionFromFile(std::string_view f
157158
void CalibdEdxContainer::setPolTopologyCorrection(const CalibdEdxTrackTopologyPol& calibTrackTopology)
158159
{
159160
setTopologyCorrection(calibTrackTopology, mCalibTrackTopologyPol);
161+
mCalibTrackTopologySpline = nullptr;
160162
}
161163

162164
void CalibdEdxContainer::setDefaultPolTopologyCorrection()
163165
{
164166
CalibdEdxTrackTopologyPol calibTrackTopology;
165167
calibTrackTopology.setDefaultPolynomials();
166168
setTopologyCorrection(calibTrackTopology, mCalibTrackTopologyPol);
169+
mCalibTrackTopologySpline = nullptr;
167170
}
168171

169172
void CalibdEdxContainer::setSplineTopologyCorrection(const CalibdEdxTrackTopologySpline& calibTrackTopology)
170173
{
171174
setTopologyCorrection(calibTrackTopology, mCalibTrackTopologySpline);
175+
mCalibTrackTopologyPol = nullptr;
172176
}
173177

174178
void CalibdEdxContainer::loadZeroSupresssionThresholdFromFile(std::string_view fileName, std::string_view objName, const float minCorrectionFactor, const float maxCorrectionFactor)

GPU/GPUTracking/DataTypes/CalibdEdxContainer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ class CalibdEdxContainer : public o2::gpu::FlatObject
267267

268268
#if !defined(GPUCA_GPUCODE)
269269
template <class Type>
270-
void cloneFromObject(Type*& obj, const Type* objOld, char* newFlatBufferPtr, const char* oldFlatBufferPtr);
270+
void subobjectCloneFromObject(Type*& obj, const Type* objOld);
271271

272272
/// this functions 'smoothes' a CalDet by calculating for each value in a pad the average value using the neighbouring pads, but do not take into account the current pad
273273
/// \return returns 'smoothed' CalDet object

0 commit comments

Comments
 (0)