diff options
author | Eirik Aavitsland <eirik.aavitsland@qt.io> | 2018-03-16 15:10:10 +0100 |
---|---|---|
committer | Eirik Aavitsland <eirik.aavitsland@qt.io> | 2018-04-12 21:22:41 +0000 |
commit | ca58764da1cc57c8546607c0a83d085a8c5a298e (patch) | |
tree | 128ce05aba56e8f7716a4f8d022d71ff27fa18c4 | |
parent | 7f782e1fc41ff7694f9bf7434d5a4db0545c0413 (diff) |
PDF engine: handle abnormally long string cases
The output routine used a fixed size scratch buffer, with no attempt
to handle overrun. Add a simple fallback code path for such (extremely
rare) cases.
Task-number: QTBUG-66788
Change-Id: I52531b829baeaa48a8fb5a637a020ee9f89d270a
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
-rw-r--r-- | src/gui/painting/qpdf.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/gui/painting/qpdf.cpp b/src/gui/painting/qpdf.cpp index e421055ef3..e58f9cee4c 100644 --- a/src/gui/painting/qpdf.cpp +++ b/src/gui/painting/qpdf.cpp @@ -2045,7 +2045,6 @@ void QPdfEnginePrivate::printString(const QString &string) } -// For strings up to 10000 bytes only ! void QPdfEnginePrivate::xprintf(const char* fmt, ...) { if (!stream) @@ -2057,12 +2056,18 @@ void QPdfEnginePrivate::xprintf(const char* fmt, ...) va_list args; va_start(args, fmt); int bufsize = qvsnprintf(buf, msize, fmt, args); - - Q_ASSERT(bufsize<msize); - va_end(args); - stream->writeRawData(buf, bufsize); + if (Q_LIKELY(bufsize < msize)) { + stream->writeRawData(buf, bufsize); + } else { + // Fallback for abnormal cases + QScopedArrayPointer<char> tmpbuf(new char[bufsize + 1]); + va_start(args, fmt); + bufsize = qvsnprintf(tmpbuf.data(), bufsize + 1, fmt, args); + va_end(args); + stream->writeRawData(tmpbuf.data(), bufsize); + } streampos += bufsize; } |