summaryrefslogtreecommitdiffstats
path: root/src/widgets/dialogs/qinputdialog.cpp
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2016-07-11 19:55:24 +0200
committerMarc Mutz <marc.mutz@kdab.com>2017-02-06 14:41:46 +0000
commitc876bb1f1333e47722e202b0916415e771137071 (patch)
tree34401974dd6a2993561b577b07b20955a696adb7 /src/widgets/dialogs/qinputdialog.cpp
parentbbd091ac5853d7884929369da4e1b5d233ca504c (diff)
QInputDialog: prevent crash in static get*() functions when parent gets deleted
As explained in https://blogs.kde.org/2009/03/26/how-crash-almost-every-qtkde-application-and-how-fix-it-0 creating dialogs on the stack is a bad idea if the application or the dialog's parent window can be closed by means other than user interaction (such as a timer or an IPC call). Since we cannot know whether Qt is used to build such an application, we must assume it is, create the dialog on the heap, and monitor its lifetime with a QPointer. Instead of using manual resource management, add a minimal implementation of QAutoPointer, and use that in all static get*() functions. Task-number: QTBUG-54693 Change-Id: I6157dca18608e02be1ea2c2defbc31641defc9d1 Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> Reviewed-by: David Faure <david.faure@kdab.com>
Diffstat (limited to 'src/widgets/dialogs/qinputdialog.cpp')
-rw-r--r--src/widgets/dialogs/qinputdialog.cpp106
1 files changed, 41 insertions, 65 deletions
diff --git a/src/widgets/dialogs/qinputdialog.cpp b/src/widgets/dialogs/qinputdialog.cpp
index d09f77ea35..4ca3923d8d 100644
--- a/src/widgets/dialogs/qinputdialog.cpp
+++ b/src/widgets/dialogs/qinputdialog.cpp
@@ -1194,10 +1194,6 @@ void QInputDialog::done(int result)
\snippet dialogs/standarddialogs/dialog.cpp 3
- \warning Do not delete \a parent during the execution of the dialog. If you
- want to do this, you should create the dialog yourself using one of the
- QInputDialog constructors.
-
\sa getInt(), getDouble(), getItem(), getMultiLineText()
*/
@@ -1205,18 +1201,18 @@ QString QInputDialog::getText(QWidget *parent, const QString &title, const QStri
QLineEdit::EchoMode mode, const QString &text, bool *ok,
Qt::WindowFlags flags, Qt::InputMethodHints inputMethodHints)
{
- QInputDialog dialog(parent, flags);
- dialog.setWindowTitle(title);
- dialog.setLabelText(label);
- dialog.setTextValue(text);
- dialog.setTextEchoMode(mode);
- dialog.setInputMethodHints(inputMethodHints);
+ QAutoPointer<QInputDialog> dialog(new QInputDialog(parent, flags));
+ dialog->setWindowTitle(title);
+ dialog->setLabelText(label);
+ dialog->setTextValue(text);
+ dialog->setTextEchoMode(mode);
+ dialog->setInputMethodHints(inputMethodHints);
- int ret = dialog.exec();
+ const int ret = dialog->exec();
if (ok)
*ok = !!ret;
if (ret) {
- return dialog.textValue();
+ return dialog->textValue();
} else {
return QString();
}
@@ -1246,10 +1242,6 @@ QString QInputDialog::getText(QWidget *parent, const QString &title, const QStri
\snippet dialogs/standarddialogs/dialog.cpp 4
- \warning Do not delete \a parent during the execution of the dialog. If you
- want to do this, you should create the dialog yourself using one of the
- QInputDialog constructors.
-
\sa getInt(), getDouble(), getItem(), getText()
*/
@@ -1257,18 +1249,18 @@ QString QInputDialog::getMultiLineText(QWidget *parent, const QString &title, co
const QString &text, bool *ok, Qt::WindowFlags flags,
Qt::InputMethodHints inputMethodHints)
{
- QInputDialog dialog(parent, flags);
- dialog.setOptions(QInputDialog::UsePlainTextEditForTextInput);
- dialog.setWindowTitle(title);
- dialog.setLabelText(label);
- dialog.setTextValue(text);
- dialog.setInputMethodHints(inputMethodHints);
+ QAutoPointer<QInputDialog> dialog(new QInputDialog(parent, flags));
+ dialog->setOptions(QInputDialog::UsePlainTextEditForTextInput);
+ dialog->setWindowTitle(title);
+ dialog->setLabelText(label);
+ dialog->setTextValue(text);
+ dialog->setInputMethodHints(inputMethodHints);
- int ret = dialog.exec();
+ const int ret = dialog->exec();
if (ok)
*ok = !!ret;
if (ret) {
- return dialog.textValue();
+ return dialog->textValue();
} else {
return QString();
}
@@ -1298,28 +1290,24 @@ QString QInputDialog::getMultiLineText(QWidget *parent, const QString &title, co
\snippet dialogs/standarddialogs/dialog.cpp 0
- \warning Do not delete \a parent during the execution of the dialog. If you
- want to do this, you should create the dialog yourself using one of the
- QInputDialog constructors.
-
\sa getText(), getDouble(), getItem(), getMultiLineText()
*/
int QInputDialog::getInt(QWidget *parent, const QString &title, const QString &label, int value,
int min, int max, int step, bool *ok, Qt::WindowFlags flags)
{
- QInputDialog dialog(parent, flags);
- dialog.setWindowTitle(title);
- dialog.setLabelText(label);
- dialog.setIntRange(min, max);
- dialog.setIntValue(value);
- dialog.setIntStep(step);
+ QAutoPointer<QInputDialog> dialog(new QInputDialog(parent, flags));
+ dialog->setWindowTitle(title);
+ dialog->setLabelText(label);
+ dialog->setIntRange(min, max);
+ dialog->setIntValue(value);
+ dialog->setIntStep(step);
- int ret = dialog.exec();
+ const int ret = dialog->exec();
if (ok)
*ok = !!ret;
if (ret) {
- return dialog.intValue();
+ return dialog->intValue();
} else {
return value;
}
@@ -1350,10 +1338,6 @@ int QInputDialog::getInt(QWidget *parent, const QString &title, const QString &l
\snippet dialogs/standarddialogs/dialog.cpp 0
- \warning Do not delete \a parent during the execution of the dialog. If you
- want to do this, you should create the dialog yourself using one of the
- QInputDialog constructors.
-
\sa getText(), getDouble(), getItem(), getMultiLineText()
*/
@@ -1379,10 +1363,6 @@ int QInputDialog::getInt(QWidget *parent, const QString &title, const QString &l
\snippet dialogs/standarddialogs/dialog.cpp 1
- \warning Do not delete \a parent during the execution of the dialog. If you
- want to do this, you should create the dialog yourself using one of the
- QInputDialog constructors.
-
\sa getText(), getInt(), getItem(), getMultiLineText()
*/
@@ -1390,18 +1370,18 @@ double QInputDialog::getDouble(QWidget *parent, const QString &title, const QStr
double value, double min, double max, int decimals, bool *ok,
Qt::WindowFlags flags)
{
- QInputDialog dialog(parent, flags);
- dialog.setWindowTitle(title);
- dialog.setLabelText(label);
- dialog.setDoubleDecimals(decimals);
- dialog.setDoubleRange(min, max);
- dialog.setDoubleValue(value);
+ QAutoPointer<QInputDialog> dialog(new QInputDialog(parent, flags));
+ dialog->setWindowTitle(title);
+ dialog->setLabelText(label);
+ dialog->setDoubleDecimals(decimals);
+ dialog->setDoubleRange(min, max);
+ dialog->setDoubleValue(value);
- int ret = dialog.exec();
+ const int ret = dialog->exec();
if (ok)
*ok = !!ret;
if (ret) {
- return dialog.doubleValue();
+ return dialog->doubleValue();
} else {
return value;
}
@@ -1433,10 +1413,6 @@ double QInputDialog::getDouble(QWidget *parent, const QString &title, const QStr
\snippet dialogs/standarddialogs/dialog.cpp 2
- \warning Do not delete \a parent during the execution of the dialog. If you
- want to do this, you should create the dialog yourself using one of the
- QInputDialog constructors.
-
\sa getText(), getInt(), getDouble(), getMultiLineText()
*/
@@ -1446,19 +1422,19 @@ QString QInputDialog::getItem(QWidget *parent, const QString &title, const QStri
{
QString text(items.value(current));
- QInputDialog dialog(parent, flags);
- dialog.setWindowTitle(title);
- dialog.setLabelText(label);
- dialog.setComboBoxItems(items);
- dialog.setTextValue(text);
- dialog.setComboBoxEditable(editable);
- dialog.setInputMethodHints(inputMethodHints);
+ QAutoPointer<QInputDialog> dialog(new QInputDialog(parent, flags));
+ dialog->setWindowTitle(title);
+ dialog->setLabelText(label);
+ dialog->setComboBoxItems(items);
+ dialog->setTextValue(text);
+ dialog->setComboBoxEditable(editable);
+ dialog->setInputMethodHints(inputMethodHints);
- int ret = dialog.exec();
+ const int ret = dialog->exec();
if (ok)
*ok = !!ret;
if (ret) {
- return dialog.textValue();
+ return dialog->textValue();
} else {
return text;
}