diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-09-23 14:23:20 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-09-23 12:54:46 +0000 |
commit | 90b5d7fa03f9818fa5edc897ee6a109fcc182b9e (patch) | |
tree | df7dca0f801b0e9cf12c37d99bc4be2acfeb8a43 | |
parent | 6761636bf7f3f90b7c82e4ac7be79d9d6a032d52 (diff) |
Fix ubsan error
memcpy can't officially copy from nullptr, not even 0 bytes.
Pick-to: 5.15
Change-Id: Ie6ede9a861cb2ae7ab35a50db5aa6c82cea6ad76
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-rw-r--r-- | src/qml/compiler/qv4compiler.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/qml/compiler/qv4compiler.cpp b/src/qml/compiler/qv4compiler.cpp index 5665f5fb6b..5511ed304a 100644 --- a/src/qml/compiler/qv4compiler.cpp +++ b/src/qml/compiler/qv4compiler.cpp @@ -346,11 +346,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) @@ -358,7 +360,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); @@ -366,8 +369,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) { |