aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jit/qv4assemblercommon.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-06-13 09:08:20 +0200
committerUlf Hermann <ulf.hermann@qt.io>2023-06-14 08:03:59 +0200
commit40bb234f5804a6a8139199a07be0e071c6e2be04 (patch)
treef0c3ad183747c8f1eb067fb75f58929fd23102e9 /src/qml/jit/qv4assemblercommon.cpp
parent6c1f57cc8deee5e97f1851c7a698e1d1c5a64fa4 (diff)
JIT: Fix buffer writing in vprintf()
qvsnprintf() can return -1, as well as QIODevice::write(). We must not pass a negative number to memset(), and we need to loop the writes in case the actually written bytes were less than what we asked for. Coverity-Id: 408783 Change-Id: Id697ae38c0342afa81590a570358d5fcc3aa8656 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/jit/qv4assemblercommon.cpp')
-rw-r--r--src/qml/jit/qv4assemblercommon.cpp18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/qml/jit/qv4assemblercommon.cpp b/src/qml/jit/qv4assemblercommon.cpp
index 3938265019..2b33d0aa10 100644
--- a/src/qml/jit/qv4assemblercommon.cpp
+++ b/src/qml/jit/qv4assemblercommon.cpp
@@ -44,10 +44,20 @@ public:
void vprintf(const char* format, va_list argList) override WTF_ATTRIBUTE_PRINTF(2, 0)
{
- const int written = qvsnprintf(buf.data(), buf.size(), format, argList);
- if (written > 0)
- dest->write(buf.constData(), written);
- memset(buf.data(), 0, qMin(written, buf.size()));
+ const int printed = qvsnprintf(buf.data(), buf.size(), format, argList);
+ Q_ASSERT(printed <= buf.size());
+
+ qint64 written = 0;
+ while (written < printed) {
+ const qint64 result = dest->write(buf.constData() + written, printed - written);
+ if (result < 0)
+ break;
+ written += result;
+ }
+
+ Q_ASSERT(written <= buf.size());
+ Q_ASSERT(written >= 0);
+ memset(buf.data(), 0, size_t(written));
}
void flush() override