From 78bc427395116bfaf3d99134f42aec5310020f8e Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Tue, 6 Sep 2016 17:44:08 +0200 Subject: Fix UB (signed overflow) in QSvgIconEnginePrivate::pmcKey() Found by UBsan: qsvgiconengine.cpp:64:84: runtime error: left shift of 537133056 by 4 places cannot be represented in type 'int' Fix by casting to qint64 at the start of the shift-or chain. The total cumulative shift is by 28 places, so 64 bits should be enough to not overflow anymore. Change-Id: Ia37bc98c5af67a4de10fb9807addd369110f36d2 Reviewed-by: Edward Welbourne Reviewed-by: Thiago Macieira --- src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp b/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp index 086f5a9..0a01abe 100644 --- a/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp +++ b/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp @@ -61,7 +61,7 @@ public: QString pmcKey(const QSize &size, QIcon::Mode mode, QIcon::State state) { return QLatin1String("$qt_svgicon_") + QString::number(serialNum, 16).append(QLatin1Char('_')) - + QString::number((((((size.width()<<11)|size.height())<<11)|mode)<<4)|state, 16); } + + QString::number((((((qint64(size.width()) << 11) | size.height()) << 11) | mode) << 4) | state, 16); } void stepSerialNum() { serialNum = lastSerialNum.fetchAndAddRelaxed(1); } -- cgit v1.2.1