From ae8389e19c5804c867b2981311c623003a691474 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 16 Nov 2018 17:24:09 +0100 Subject: [PATCH] Ensure alignment of image-data Instead of relying on the return value of malloc having the correct alignment, use proper non-throwing new[] operators. Change-Id: I06c6c619e21c848f3d184bdb7cef8c5589c1c7ab Reviewed-by: Thiago Macieira --- src/gui/image/qimage.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp index 0105f1decdd..da963adae68 100644 --- a/src/gui/image/qimage.cpp +++ b/src/gui/image/qimage.cpp @@ -149,7 +149,10 @@ QImageData * QImageData::create(const QSize &size, QImage::Format format) d->bytes_per_line = params.bytesPerLine; d->nbytes = params.totalSize; - d->data = (uchar *)malloc(d->nbytes); + if (depth == 64) + d->data = (uchar *)new (std::nothrow) quint64[d->nbytes / sizeof(quint64)]; + else // nbytes is known to already be a multipla of 4: + d->data = (uchar *)new (std::nothrow) quint32[d->nbytes / sizeof(quint32)]; if (!d->data) return nullptr; @@ -165,8 +168,13 @@ QImageData::~QImageData() if (is_cached) QImagePixmapCleanupHooks::executeImageHooks((((qint64) ser_no) << 32) | ((qint64) detach_no)); delete paintEngine; - if (data && own_data) - free(data); + if (data && own_data) { + // Casting to avoid being theoretically UB: + if (depth == 64) + delete[] (quint64 *)data; + else + delete[] (quint32 *)data; + } data = 0; }