diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 2345cb0ab88..007837ebf5e 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -1348,6 +1348,7 @@ void QXcbWindow::setWindowIconText(const QString &title) void QXcbWindow::setWindowIcon(const QIcon &icon) { QList icon_data; + const uint32_t sizeLimit = xcb_get_maximum_request_length(xcb_connection()); if (!icon.isNull()) { QList availableSizes = icon.availableSizes(); if (availableSizes.isEmpty()) { @@ -1363,7 +1364,12 @@ void QXcbWindow::setWindowIcon(const QIcon &icon) if (!pixmap.isNull()) { QImage image = pixmap.toImage().convertToFormat(QImage::Format_ARGB32); int pos = icon_data.size(); - icon_data.resize(pos + 2 + image.width()*image.height()); + int newSize = pos + 2 + image.width()*image.height(); + // In the absence of the BIG-REQUESTS extension, or with too big DPR, + // the size of icon data is too big for the xcb request very easily. + if (quint64(newSize) > quint64(sizeLimit)) + break; + icon_data.resize(newSize); icon_data[pos++] = image.width(); icon_data[pos++] = image.height(); memcpy(icon_data.data() + pos, image.bits(), image.width()*image.height()*4); @@ -1373,10 +1379,10 @@ void QXcbWindow::setWindowIcon(const QIcon &icon) if (!icon_data.isEmpty()) { // Ignore icon exceeding maximum xcb request length - if (quint64(icon_data.size()) > quint64(xcb_get_maximum_request_length(xcb_connection()))) { + if (quint64(icon_data.size()) > quint64(sizeLimit)) { qWarning() << "Ignoring window icon" << icon_data.size() << "exceeds maximum xcb request length" - << xcb_get_maximum_request_length(xcb_connection()); + << sizeLimit; return; } xcb_change_property(xcb_connection(),