[poppler] qt5/src qt6/src

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Dec 30 19:17:46 UTC 2020


 qt5/src/poppler-qiodeviceoutstream.cc |   20 +++++++++++++++-----
 qt6/src/poppler-qiodeviceoutstream.cc |   20 +++++++++++++++-----
 2 files changed, 30 insertions(+), 10 deletions(-)

New commits:
commit 8846eb5d2e1466cf0aaa1f38d5452b60c47bd9dc
Author: Albert Astals Cid <aacid at kde.org>
Date:   Wed Dec 30 17:37:41 2020 +0100

    QIODeviceOutStream: allocate memory dynamically
    
    Instead of using a fixed size array.
    
    I've only seen this being problematic in oss-fuzz created files,
    but I don't see why an actual file wouldn't create issues here too,
    so even if this is a bit slower, be on the safe side.

diff --git a/qt5/src/poppler-qiodeviceoutstream.cc b/qt5/src/poppler-qiodeviceoutstream.cc
index 002bdb00..d6ee0cdb 100644
--- a/qt5/src/poppler-qiodeviceoutstream.cc
+++ b/qt5/src/poppler-qiodeviceoutstream.cc
@@ -1,6 +1,7 @@
 /* poppler-qiodevicestream.cc: Qt5 interface to poppler
  * Copyright (C) 2008, Pino Toscano <pino at kde.org>
  * Copyright (C) 2013 Adrian Johnson <ajohnson at redneon.com>
+ * Copyright (C) 2020 Albert Astals Cid <aacid at kde.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,8 +24,6 @@
 
 #include <cstdio>
 
-#define QIODeviceOutStreamBufSize 8192
-
 namespace Poppler {
 
 QIODeviceOutStream::QIODeviceOutStream(QIODevice *device) : m_device(device) { }
@@ -43,15 +42,26 @@ void QIODeviceOutStream::put(char c)
     m_device->putChar(c);
 }
 
+static int poppler_qvasprintf(char **buf_ptr, const char *format, va_list ap)
+{
+    va_list ap_copy;
+    va_copy(ap_copy, ap);
+    const size_t size = qvsnprintf(nullptr, 0, format, ap_copy) + 1;
+    va_end(ap_copy);
+    *buf_ptr = new char[size];
+
+    return qvsnprintf(*buf_ptr, size, format, ap);
+}
+
 void QIODeviceOutStream::printf(const char *format, ...)
 {
     va_list ap;
     va_start(ap, format);
-    char buf[QIODeviceOutStreamBufSize];
-    size_t bufsize = 0;
-    bufsize = qvsnprintf(buf, QIODeviceOutStreamBufSize - 1, format, ap);
+    char *buf;
+    const size_t bufsize = poppler_qvasprintf(&buf, format, ap);
     va_end(ap);
     m_device->write(buf, bufsize);
+    delete[] buf;
 }
 
 }
diff --git a/qt6/src/poppler-qiodeviceoutstream.cc b/qt6/src/poppler-qiodeviceoutstream.cc
index e300fe0d..c9c61e33 100644
--- a/qt6/src/poppler-qiodeviceoutstream.cc
+++ b/qt6/src/poppler-qiodeviceoutstream.cc
@@ -1,6 +1,7 @@
 /* poppler-qiodevicestream.cc: Qt6 interface to poppler
  * Copyright (C) 2008, Pino Toscano <pino at kde.org>
  * Copyright (C) 2013 Adrian Johnson <ajohnson at redneon.com>
+ * Copyright (C) 2020 Albert Astals Cid <aacid at kde.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,8 +24,6 @@
 
 #include <cstdio>
 
-#define QIODeviceOutStreamBufSize 8192
-
 namespace Poppler {
 
 QIODeviceOutStream::QIODeviceOutStream(QIODevice *device) : m_device(device) { }
@@ -43,15 +42,26 @@ void QIODeviceOutStream::put(char c)
     m_device->putChar(c);
 }
 
+static int poppler_qvasprintf(char **buf_ptr, const char *format, va_list ap)
+{
+    va_list ap_copy;
+    va_copy(ap_copy, ap);
+    const size_t size = qvsnprintf(nullptr, 0, format, ap_copy) + 1;
+    va_end(ap_copy);
+    *buf_ptr = new char[size];
+
+    return qvsnprintf(*buf_ptr, size, format, ap);
+}
+
 void QIODeviceOutStream::printf(const char *format, ...)
 {
     va_list ap;
     va_start(ap, format);
-    char buf[QIODeviceOutStreamBufSize];
-    size_t bufsize = 0;
-    bufsize = qvsnprintf(buf, QIODeviceOutStreamBufSize - 1, format, ap);
+    char *buf;
+    const size_t bufsize = poppler_qvasprintf(&buf, format, ap);
     va_end(ap);
     m_device->write(buf, bufsize);
+    delete[] buf;
 }
 
 }


More information about the poppler mailing list