summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2021-02-26 13:16:16 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2021-03-02 08:09:03 +0100
commitb984689ec881ffb2cf2ee56f98cfaa1e2a4da54a (patch)
treed2690029acc438f5bc9535aefa24c4273231a9a4 /src/gui
parentb46b33c8179774a32b7f87cafdb942ab64f8e1e2 (diff)
Handle para tags the same way for OOB checks as the other tags
Do not include the first parameter in the main tag anymore. That is a left over from before unaligned access was added. Pick-to: 6.1 Change-Id: I2caf027c6b9930d3e23fe5ec8bdcd45db34835a9 Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/painting/qicc.cpp37
1 files changed, 16 insertions, 21 deletions
diff --git a/src/gui/painting/qicc.cpp b/src/gui/painting/qicc.cpp
index 4be339b299..2e6d295ce5 100644
--- a/src/gui/painting/qicc.cpp
+++ b/src/gui/painting/qicc.cpp
@@ -171,7 +171,7 @@ struct CurvTagData : GenericTagData {
struct ParaTagData : GenericTagData {
quint16_be curveType;
quint16_be null2;
- quint32_be parameter[1];
+ // followed by parameter values: quint32_be[1-7];
};
struct DescTagData : GenericTagData {
@@ -507,26 +507,24 @@ bool parseTRC(const QByteArray &data, const TagEntry &tagEntry, QColorTrc &gamma
return true;
}
if (trcData.type == quint32(Tag::para)) {
- if (tagEntry.size < sizeof(ParaTagData))
- return false;
- static_assert(sizeof(GenericTagData) == 2 * sizeof(quint32_be),
- "GenericTagData has padding. The following code is a subject to UB.");
+ Q_STATIC_ASSERT(sizeof(ParaTagData) == 12);
const ParaTagData para = qFromUnaligned<ParaTagData>(data.constData() + tagEntry.offset);
- // re-read first parameter for consistency:
- const auto parametersOffset = tagEntry.offset + sizeof(GenericTagData)
- + 2 * sizeof(quint16_be);
+ const auto parametersOffset = tagEntry.offset + sizeof(ParaTagData);
+ quint32 parameters[7];
switch (para.curveType) {
case 0: {
- float g = fromFixedS1516(para.parameter[0]);
+ if (tagEntry.size < sizeof(ParaTagData) + 1 * 4)
+ return false;
+ qFromBigEndian<quint32>(data.constData() + parametersOffset, 1, parameters);
+ float g = fromFixedS1516(parameters[0]);
gamma.m_type = QColorTrc::Type::Function;
gamma.m_fun = QColorTransferFunction::fromGamma(g);
break;
}
case 1: {
- if (tagEntry.size < sizeof(ParaTagData) + 2 * 4)
+ if (tagEntry.size < sizeof(ParaTagData) + 3 * 4)
return false;
- std::array<quint32_be, 3> parameters =
- qFromUnaligned<decltype(parameters)>(data.constData() + parametersOffset);
+ qFromBigEndian<quint32>(data.constData() + parametersOffset, 3, parameters);
if (parameters[1] == 0)
return false;
float g = fromFixedS1516(parameters[0]);
@@ -538,10 +536,9 @@ bool parseTRC(const QByteArray &data, const TagEntry &tagEntry, QColorTrc &gamma
break;
}
case 2: {
- if (tagEntry.size < sizeof(ParaTagData) + 3 * 4)
+ if (tagEntry.size < sizeof(ParaTagData) + 4 * 4)
return false;
- std::array<quint32_be, 4> parameters =
- qFromUnaligned<decltype(parameters)>(data.constData() + parametersOffset);
+ qFromBigEndian<quint32>(data.constData() + parametersOffset, 4, parameters);
if (parameters[1] == 0)
return false;
float g = fromFixedS1516(parameters[0]);
@@ -554,10 +551,9 @@ bool parseTRC(const QByteArray &data, const TagEntry &tagEntry, QColorTrc &gamma
break;
}
case 3: {
- if (tagEntry.size < sizeof(ParaTagData) + 4 * 4)
+ if (tagEntry.size < sizeof(ParaTagData) + 5 * 4)
return false;
- std::array<quint32_be, 5> parameters =
- qFromUnaligned<decltype(parameters)>(data.constData() + parametersOffset);
+ qFromBigEndian<quint32>(data.constData() + parametersOffset, 5, parameters);
float g = fromFixedS1516(parameters[0]);
float a = fromFixedS1516(parameters[1]);
float b = fromFixedS1516(parameters[2]);
@@ -568,10 +564,9 @@ bool parseTRC(const QByteArray &data, const TagEntry &tagEntry, QColorTrc &gamma
break;
}
case 4: {
- if (tagEntry.size < sizeof(ParaTagData) + 6 * 4)
+ if (tagEntry.size < sizeof(ParaTagData) + 7 * 4)
return false;
- std::array<quint32_be, 7> parameters =
- qFromUnaligned<decltype(parameters)>(data.constData() + parametersOffset);
+ qFromBigEndian<quint32>(data.constData() + parametersOffset, 7, parameters);
float g = fromFixedS1516(parameters[0]);
float a = fromFixedS1516(parameters[1]);
float b = fromFixedS1516(parameters[2]);