QShader: fix memory leak in detach()

qAtomicDetach() does   d = new T(*d);  which calls the copy constructor.
Since there was no copy constructor declared for QShaderPrivate,
the compiler generated one which copied the refcount over, instead of
setting it to 1 in the detached instance. As a result, the destructor
didn't delete the QShaderPrivate.

Nothing was calling this constructor that takes a pointer, so clearly
this was a typo for a copy constructor.

Detected in an ASAN build, the qsb tool exited in error.

Pick-to: 6.3 6.2 5.15
Change-Id: Idbe659b52d2600ac7c11b09142a6aa5b25310df9
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
bb10
David Faure 2022-03-13 15:21:19 +01:00
parent d8d202a3ba
commit fd4672d020
2 changed files with 18 additions and 18 deletions

View File

@ -72,14 +72,14 @@ struct Q_GUI_EXPORT QShaderPrivate
{
}
QShaderPrivate(const QShaderPrivate *other)
QShaderPrivate(const QShaderPrivate &other)
: ref(1),
qsbVersion(other->qsbVersion),
stage(other->stage),
desc(other->desc),
shaders(other->shaders),
bindings(other->bindings),
combinedImageMap(other->combinedImageMap)
qsbVersion(other.qsbVersion),
stage(other.stage),
desc(other.desc),
shaders(other.shaders),
bindings(other.bindings),
combinedImageMap(other.combinedImageMap)
{
}

View File

@ -66,18 +66,18 @@ struct Q_GUI_EXPORT QShaderDescriptionPrivate
localSize[0] = localSize[1] = localSize[2] = 0;
}
QShaderDescriptionPrivate(const QShaderDescriptionPrivate *other)
QShaderDescriptionPrivate(const QShaderDescriptionPrivate &other)
: ref(1),
inVars(other->inVars),
outVars(other->outVars),
uniformBlocks(other->uniformBlocks),
pushConstantBlocks(other->pushConstantBlocks),
storageBlocks(other->storageBlocks),
combinedImageSamplers(other->combinedImageSamplers),
separateImages(other->separateImages),
separateSamplers(other->separateSamplers),
storageImages(other->storageImages),
localSize(other->localSize)
inVars(other.inVars),
outVars(other.outVars),
uniformBlocks(other.uniformBlocks),
pushConstantBlocks(other.pushConstantBlocks),
storageBlocks(other.storageBlocks),
combinedImageSamplers(other.combinedImageSamplers),
separateImages(other.separateImages),
separateSamplers(other.separateSamplers),
storageImages(other.storageImages),
localSize(other.localSize)
{
}