aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-02-13 08:15:16 +0100
committerUlf Hermann <ulf.hermann@qt.io>2023-02-17 11:06:21 +0100
commite3cc1bdb1c77c73d6f7fcfc0d18835ac45477b37 (patch)
tree2d97b55804e08940c93eeb49f92e1f88b6cdcbee
parentd4bb93cb0580d5dce013e7bcbe2727a98d1ab8bd (diff)
qmltyperegistrar: Guard against file system failures
Pick-to: 6.5 Coverity-Id: 404703 Change-Id: Icf3fd90e392891bcc0c48f4ce6be8731abbeb1aa Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-rw-r--r--src/qmltyperegistrar/qqmltyperegistrar.cpp4
-rw-r--r--src/qmltyperegistrar/qqmltyperegistrar_p.h2
-rw-r--r--src/qmltyperegistrar/qqmltypescreator.cpp12
-rw-r--r--src/qmltyperegistrar/qqmltypescreator_p.h2
-rw-r--r--tools/qmltyperegistrar/qmltyperegistrar.cpp6
5 files changed, 17 insertions, 9 deletions
diff --git a/src/qmltyperegistrar/qqmltyperegistrar.cpp b/src/qmltyperegistrar/qqmltyperegistrar.cpp
index 43cf5ece2e..75072c926f 100644
--- a/src/qmltyperegistrar/qqmltyperegistrar.cpp
+++ b/src/qmltyperegistrar/qqmltyperegistrar.cpp
@@ -447,7 +447,7 @@ static const QQmlModuleRegistration registration("%1", %4);
output << u"} // namespace %1\n"_s.arg(m_targetNamespace);
}
-void QmlTypeRegistrar::generatePluginTypes(const QString &pluginTypesFile)
+bool QmlTypeRegistrar::generatePluginTypes(const QString &pluginTypesFile)
{
QmlTypesCreator creator;
creator.setOwnTypes(m_types);
@@ -456,7 +456,7 @@ void QmlTypeRegistrar::generatePluginTypes(const QString &pluginTypesFile)
creator.setModule(m_module);
creator.setVersion(QTypeRevision::fromVersion(m_moduleVersion.majorVersion(), 0));
- creator.generate(pluginTypesFile);
+ return creator.generate(pluginTypesFile);
}
void QmlTypeRegistrar::setModuleNameAndNamespace(const QString &module,
diff --git a/src/qmltyperegistrar/qqmltyperegistrar_p.h b/src/qmltyperegistrar/qqmltyperegistrar_p.h
index a01b4f1e15..659c7ea988 100644
--- a/src/qmltyperegistrar/qqmltyperegistrar_p.h
+++ b/src/qmltyperegistrar/qqmltyperegistrar_p.h
@@ -41,7 +41,7 @@ class QmlTypeRegistrar
public:
void write(QTextStream &os);
- void generatePluginTypes(const QString &pluginTypesFile);
+ bool generatePluginTypes(const QString &pluginTypesFile);
void setModuleNameAndNamespace(const QString &module, const QString &targetNamespace);
void setModuleVersions(QTypeRevision moduleVersion, const QList<quint8> &pastMajorVersions,
bool followForeignVersioning);
diff --git a/src/qmltyperegistrar/qqmltypescreator.cpp b/src/qmltyperegistrar/qqmltypescreator.cpp
index dbc438c50e..d7b25cca56 100644
--- a/src/qmltyperegistrar/qqmltypescreator.cpp
+++ b/src/qmltyperegistrar/qqmltypescreator.cpp
@@ -423,7 +423,7 @@ void QmlTypesCreator::writeComponents()
}
}
-void QmlTypesCreator::generate(const QString &outFileName)
+bool QmlTypesCreator::generate(const QString &outFileName)
{
m_qml.writeStartDocument();
m_qml.writeLibraryImport(QLatin1String("QtQuick.tooling"), 1, 2);
@@ -439,9 +439,13 @@ void QmlTypesCreator::generate(const QString &outFileName)
m_qml.writeEndObject();
QSaveFile file(outFileName);
- file.open(QIODevice::WriteOnly);
- file.write(m_output);
- file.commit();
+ if (!file.open(QIODevice::WriteOnly))
+ return false;
+
+ if (file.write(m_output) != m_output.size())
+ return false;
+
+ return file.commit();
}
QT_END_NAMESPACE
diff --git a/src/qmltyperegistrar/qqmltypescreator_p.h b/src/qmltyperegistrar/qqmltypescreator_p.h
index 928e3cf6d8..eeab19a71b 100644
--- a/src/qmltyperegistrar/qqmltypescreator_p.h
+++ b/src/qmltyperegistrar/qqmltypescreator_p.h
@@ -28,7 +28,7 @@ class QmlTypesCreator
public:
QmlTypesCreator() : m_qml(&m_output) {}
- void generate(const QString &outFileName);
+ bool generate(const QString &outFileName);
void setOwnTypes(QVector<QJsonObject> ownTypes) { m_ownTypes = std::move(ownTypes); }
void setForeignTypes(QVector<QJsonObject> foreignTypes) { m_foreignTypes = std::move(foreignTypes); }
diff --git a/tools/qmltyperegistrar/qmltyperegistrar.cpp b/tools/qmltyperegistrar/qmltyperegistrar.cpp
index 5d895bbed7..c24fd38561 100644
--- a/tools/qmltyperegistrar/qmltyperegistrar.cpp
+++ b/tools/qmltyperegistrar/qmltyperegistrar.cpp
@@ -156,6 +156,10 @@ int main(int argc, char **argv)
return EXIT_SUCCESS;
typeRegistrar.setReferencedTypes(processor.referencedTypes());
- typeRegistrar.generatePluginTypes(parser.value(pluginTypesOption));
+ const QString qmltypes = parser.value(pluginTypesOption);
+ if (!typeRegistrar.generatePluginTypes(qmltypes)) {
+ fprintf(stderr, "Error: Cannot generate qmltypes file %s\n", qPrintable(qmltypes));
+ return EXIT_FAILURE;
+ }
return EXIT_SUCCESS;
}