From 69c05bbef47fb9d30d70e594bd5942add8b135fe Mon Sep 17 00:00:00 2001
From: Liang Qi <liang.qi@digia.com>
Date: Tue, 14 May 2013 13:46:12 +0200
Subject: [PATCH] QtWidgets: avoid integer divide by zero in QProgressDialog

Autotest is included.

Task-number: QTBUG-31046
Change-Id: Ie549b59112f458de478294fa00443a3cf6898c85
Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
---
 src/widgets/dialogs/qprogressdialog.cpp               |  1 +
 .../dialogs/qprogressdialog/tst_qprogressdialog.cpp   | 11 +++++++++++
 2 files changed, 12 insertions(+)

diff --git a/src/widgets/dialogs/qprogressdialog.cpp b/src/widgets/dialogs/qprogressdialog.cpp
index 78612f31816..b5cc630bfe5 100644
--- a/src/widgets/dialogs/qprogressdialog.cpp
+++ b/src/widgets/dialogs/qprogressdialog.cpp
@@ -662,6 +662,7 @@ void QProgressDialog::setValue(int progress)
                     int estimate;
                     int totalSteps = maximum() - minimum();
                     int myprogress = progress - minimum();
+                    if (myprogress == 0) myprogress = 1;
                     if ((totalSteps - myprogress) >= INT_MAX / elapsed)
                         estimate = (totalSteps - myprogress) / myprogress * elapsed;
                     else
diff --git a/tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp b/tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp
index d49f356d8c4..68502f0d8d4 100644
--- a/tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp
+++ b/tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp
@@ -46,6 +46,7 @@
 #include <qdebug.h>
 #include <qprogressdialog.h>
 #include <qlabel.h>
+#include <qthread.h>
 
 class tst_QProgressDialog : public QObject
 {
@@ -58,6 +59,7 @@ public:
 private slots:
     void getSetCheck();
     void task198202();
+    void QTBUG_31046();
 };
 
 tst_QProgressDialog::tst_QProgressDialog()
@@ -149,5 +151,14 @@ void tst_QProgressDialog::task198202()
     QCOMPARE(dlg.sizeHint().height(), futureHeight);
 }
 
+void tst_QProgressDialog::QTBUG_31046()
+{
+    QProgressDialog dlg("", "", 50, 60);
+    dlg.setValue(0);
+    QThread::msleep(200);
+    dlg.setValue(50);
+    QCOMPARE(50, dlg.value());
+}
+
 QTEST_MAIN(tst_QProgressDialog)
 #include "tst_qprogressdialog.moc"
-- 
GitLab