aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-09-23 14:23:20 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2020-09-23 14:36:47 +0000
commit282d192cfa3827549849f5542a858d9f74cbc04f (patch)
tree47e36966555f70b8f4edd088d9f4291d92a408f6
parent9db0ede4c953c92eb0547c2acb04d6e87ba60ac1 (diff)
Fix ubsan error
memcpy can't officially copy from nullptr, not even 0 bytes. Change-Id: Ie6ede9a861cb2ae7ab35a50db5aa6c82cea6ad76 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> (cherry picked from commit 90b5d7fa03f9818fa5edc897ee6a109fcc182b9e) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/qml/compiler/qv4compiler.cpp14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/qml/compiler/qv4compiler.cpp b/src/qml/compiler/qv4compiler.cpp
index b6096c4ccd..14cf0a0c8f 100644
--- a/src/qml/compiler/qv4compiler.cpp
+++ b/src/qml/compiler/qv4compiler.cpp
@@ -352,11 +352,13 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit(GeneratorO
*lookupsToWrite++ = l;
CompiledData::RegExp *regexpTable = reinterpret_cast<CompiledData::RegExp *>(dataPtr + unit->offsetToRegexpTable);
- memcpy(regexpTable, regexps.constData(), regexps.size() * sizeof(*regexpTable));
+ if (regexps.size())
+ memcpy(regexpTable, regexps.constData(), regexps.size() * sizeof(*regexpTable));
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
ReturnedValue *constantTable = reinterpret_cast<ReturnedValue *>(dataPtr + unit->offsetToConstantTable);
- memcpy(constantTable, constants.constData(), constants.size() * sizeof(ReturnedValue));
+ if (constants.size())
+ memcpy(constantTable, constants.constData(), constants.size() * sizeof(ReturnedValue));
#else
quint64_le *constantTable = reinterpret_cast<quint64_le *>(dataPtr + unit->offsetToConstantTable);
for (int i = 0; i < constants.count(); ++i)
@@ -364,7 +366,8 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit(GeneratorO
#endif
{
- memcpy(dataPtr + jsClassDataOffset, jsClassData.constData(), jsClassData.size());
+ if (jsClassData.size())
+ memcpy(dataPtr + jsClassDataOffset, jsClassData.constData(), jsClassData.size());
// write js classes and js class lookup table
quint32_le *jsClassOffsetTable = reinterpret_cast<quint32_le *>(dataPtr + unit->offsetToJSClassTable);
@@ -372,8 +375,9 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit(GeneratorO
jsClassOffsetTable[i] = jsClassDataOffset + jsClassOffsets.at(i);
}
-
- memcpy(dataPtr + unit->offsetToTranslationTable, translations.constData(), translations.count() * sizeof(CompiledData::TranslationData));
+ if (translations.count()) {
+ memcpy(dataPtr + unit->offsetToTranslationTable, translations.constData(), translations.count() * sizeof(CompiledData::TranslationData));
+ }
{
const auto populateExportEntryTable = [this, dataPtr](const QVector<Compiler::ExportEntry> &table, quint32_le offset) {