[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kexi] src: Fix possible dereferences when dynamic_cast<> returns nullptr
From: Jaroslaw Staniek <staniek () kde ! org>
Date: 2016-02-29 23:12:15
Message-ID: E1aaWz9-0000sv-Oo () scm ! kde ! org
[Download RAW message or body]
Git commit 5c7b449e55dfd499ce41b09c72b7fd5ae17831b0 by Jaroslaw Staniek.
Committed on 29/02/2016 at 23:07.
Pushed by staniek into branch 'master'.
Fix possible dereferences when dynamic_cast<> returns nullptr
(from Coverity reports)
M +3 -2 src/plugins/forms/kexiformscrollview.cpp
M +12 -10 src/plugins/forms/widgets/kexidbautofield.cpp
M +3 -3 src/plugins/forms/widgets/kexidbform.cpp
M +3 -2 src/plugins/forms/widgets/kexidbutils.cpp
M +2 -2 src/plugins/queries/kexiquerydesignerguieditor.cpp
M +3 -2 src/widget/dataviewcommon/kexidataawareobjectiface.cpp
M +8 -3 src/widget/tableview/kexicomboboxbase.cpp
M +1 -1 src/widget/tableview/kexicomboboxpopup.cpp
M +2 -2 src/widget/tableview/kexitableedit.cpp
http://commits.kde.org/kexi/5c7b449e55dfd499ce41b09c72b7fd5ae17831b0
diff --git a/src/plugins/forms/kexiformscrollview.cpp \
b/src/plugins/forms/kexiformscrollview.cpp index 57dff38..931567d 100644
--- a/src/plugins/forms/kexiformscrollview.cpp
+++ b/src/plugins/forms/kexiformscrollview.cpp
@@ -500,13 +500,14 @@ bool \
KexiFormScrollView::shouldDisplayDefaultValueForItem(KexiFormDataItemInterf
bool KexiFormScrollView::cancelEditor()
{
- if (!dynamic_cast<KexiFormDataItemInterface*>(m_editor))
+ KexiFormDataItemInterface *itemIface = \
dynamic_cast<KexiFormDataItemInterface*>(m_editor); + if (!itemIface) {
return false;
+ }
if (m_errorMessagePopup)
m_errorMessagePopup->close();
- KexiFormDataItemInterface *itemIface = \
dynamic_cast<KexiFormDataItemInterface*>(m_editor); itemIface->undoChanges();
const bool displayDefaultValue = shouldDisplayDefaultValueForItem(itemIface);
diff --git a/src/plugins/forms/widgets/kexidbautofield.cpp \
b/src/plugins/forms/widgets/kexidbautofield.cpp index 33ebc03..eefaf44 100644
--- a/src/plugins/forms/widgets/kexidbautofield.cpp
+++ b/src/plugins/forms/widgets/kexidbautofield.cpp
@@ -176,11 +176,11 @@ KexiDBAutoField::createEditor()
if (newSubwidget) {
newSubwidget->setObjectName(
QString::fromLatin1("KexiDBAutoField_") + \
newSubwidget->metaObject()->className());
- dynamic_cast<KexiDataItemInterface*>(newSubwidget)->setParentDataItemInterface(this);
- dynamic_cast<KexiFormDataItemInterface*>(newSubwidget)
- ->setColumnInfo(columnInfo()); //needed at least by KexiDBImageBox
- dynamic_cast<KexiFormDataItemInterface*>(newSubwidget)
- ->setVisibleColumnInfo(visibleColumnInfo()); //needed at least by \
KexiDBComboBox + KexiDataItemInterface *iface = \
dynamic_cast<KexiDataItemInterface*>(newSubwidget); + \
iface->setParentDataItemInterface(this); + KexiFormDataItemInterface \
*formIface = dynamic_cast<KexiFormDataItemInterface*>(newSubwidget); + \
formIface->setColumnInfo(columnInfo()); //needed at least by KexiDBImageBox + \
formIface->setVisibleColumnInfo(visibleColumnInfo()); //needed at least by \
KexiDBComboBox
newSubwidget->setProperty("dataSource", dataSource()); //needed at least by \
KexiDBImageBox
KFormDesigner::DesignTimeDynamicChildWidgetHandler::childWidgetAdded(this);
newSubwidget->show();
@@ -252,7 +252,7 @@ KexiDBAutoField::setLabelPosition(LabelPosition position)
if (position == Left && d->widgetType != Boolean)
d->layout->addSpacing(KexiDBAutoField_SPACING);
d->layout->addWidget(subwidget(), 1);
- KexiSubwidgetInterface *subwidgetInterface = \
dynamic_cast<KexiSubwidgetInterface*>((QWidget*)subwidget()); + \
KexiSubwidgetInterface *subwidgetInterface = \
dynamic_cast<KexiSubwidgetInterface*>(subwidget()); if (subwidgetInterface) {
if (subwidgetInterface->appendStretchRequired(this))
d->layout->addStretch(0);
@@ -276,9 +276,10 @@ KexiDBAutoField::setLabelPosition(LabelPosition position)
//a hack to force layout to be refreshed (any better idea for this?)
resize(size() + QSize(1, 0));
resize(size() - QSize(1, 0));
- if (dynamic_cast<KexiDBAutoField*>((QWidget*)subwidget())) {
+ KexiDBAutoField* autoField = dynamic_cast<KexiDBAutoField*>(subwidget());
+ if (autoField) {
//needed for KexiDBComboBox
- dynamic_cast<KexiDBAutoField*>((QWidget*)subwidget())->setLabelPosition(position);
+ autoField->setLabelPosition(position);
}
}
@@ -773,8 +774,9 @@ bool KexiDBAutoField::eventFilter(QObject *o, QEvent *e)
void KexiDBAutoField::setDisplayDefaultValue(QWidget* widget, bool \
displayDefaultValue) {
KexiFormDataItemInterface::setDisplayDefaultValue(widget, displayDefaultValue);
- if (dynamic_cast<KexiFormDataItemInterface*>((QWidget*)subwidget()))
- dynamic_cast<KexiFormDataItemInterface*>((QWidget*)subwidget())->setDisplayDefaultValue(subwidget(), \
displayDefaultValue); + KexiFormDataItemInterface *formIface = \
dynamic_cast<KexiFormDataItemInterface*>(subwidget()); + if (formIface)
+ formIface->setDisplayDefaultValue(subwidget(), displayDefaultValue);
}
void KexiDBAutoField::moveCursorToEnd()
diff --git a/src/plugins/forms/widgets/kexidbform.cpp \
b/src/plugins/forms/widgets/kexidbform.cpp index 55318df..8e445f8 100644
--- a/src/plugins/forms/widgets/kexidbform.cpp
+++ b/src/plugins/forms/widgets/kexidbform.cpp
@@ -262,7 +262,7 @@ bool KexiDBForm::eventFilter(QObject * watched, QEvent * e)
QObject *o = watched; //focusWidget();
QWidget* realWidget = dynamic_cast<QWidget*>(o); //will beused below \
(for tab/backtab handling)
- if (!tab && !backtab) {
+ if (realWidget && !tab && !backtab) {
//for buttons, left/up and right/down keys act like tab/backtab (see \
qbutton.cpp) if (realWidget->inherits("QButton")) {
if (ke->modifiers() == Qt::NoModifier && (key == Qt::Key_Right \
|| key == Qt::Key_Down)) @@ -531,8 +531,8 @@ void KexiDBForm::clear()
bool KexiDBForm::isPreviewing() const
{
- return dynamic_cast<KexiFormScrollView*>(d->dataAwareObject)
- ? dynamic_cast<KexiFormScrollView*>(d->dataAwareObject)->isPreviewing() : \
false; + const KexiFormScrollView *view = \
dynamic_cast<KexiFormScrollView*>(d->dataAwareObject); + return view ? \
view->isPreviewing() : false; }
void KexiDBForm::dragMoveEvent(QDragMoveEvent *e)
diff --git a/src/plugins/forms/widgets/kexidbutils.cpp \
b/src/plugins/forms/widgets/kexidbutils.cpp index 8f44af0..4a7b476 100644
--- a/src/plugins/forms/widgets/kexidbutils.cpp
+++ b/src/plugins/forms/widgets/kexidbutils.cpp
@@ -125,9 +125,10 @@ void KexiDBWidgetContextMenuExtender::updateActions(QMenu *menu)
// title
QString icon;
- if (dynamic_cast<QWidget*>(d->iface)) {
+ const QWidget *thisWidget = dynamic_cast<QWidget*>(d->iface);
+ if (thisWidget) {
icon = KexiFormManager::self()->library()->iconName(
- dynamic_cast<QWidget*>(d->iface)->metaObject()->className());
+ thisWidget->metaObject()->className());
}
KexiContextMenuUtils::updateTitle(
menu, d->iface->columnInfo()->captionOrAliasOrName(),
diff --git a/src/plugins/queries/kexiquerydesignerguieditor.cpp \
b/src/plugins/queries/kexiquerydesignerguieditor.cpp index 8599549..97e4584 100644
--- a/src/plugins/queries/kexiquerydesignerguieditor.cpp
+++ b/src/plugins/queries/kexiquerydesignerguieditor.cpp
@@ -396,9 +396,9 @@ KexiQueryDesignerGuiEditor::buildSchema(QString *errMsg)
//build query schema
KexiQueryPart::TempData * temp = tempData();
if (temp->query()) {
- KexiView *queryDataView = window()->viewForMode(Kexi::DataViewMode);
+ KexiQueryView *queryDataView = \
dynamic_cast<KexiQueryView*>(window()->viewForMode(Kexi::DataViewMode)); if \
(queryDataView) {
- dynamic_cast<KexiQueryView*>(queryDataView)->setData(0);
+ queryDataView->setData(0);
}
temp->clearQuery();
} else {
diff --git a/src/widget/dataviewcommon/kexidataawareobjectiface.cpp \
b/src/widget/dataviewcommon/kexidataawareobjectiface.cpp index 1d85d7c..9447da3 \
100644
--- a/src/widget/dataviewcommon/kexidataawareobjectiface.cpp
+++ b/src/widget/dataviewcommon/kexidataawareobjectiface.cpp
@@ -1227,7 +1227,8 @@ void KexiDataAwareObjectInterface::reloadData()
}
clearVariables();
- if (dynamic_cast<QWidget*>(this) && dynamic_cast<QWidget*>(this)->isVisible())
+ const QWidget* thisWidget = dynamic_cast<QWidget*>(this);
+ if (thisWidget && thisWidget->isVisible())
initDataContents();
else
m_initDataContentsOnShow = true;
@@ -1577,7 +1578,7 @@ void \
KexiDataAwareObjectInterface::verticalScrollBarValueChanged(int v)
if (m_scrollbarToolTipsEnabled && verticalScrollBar()->isSliderDown()) {
QWidget* thisWidget = dynamic_cast<QWidget*>(this);
const int record = lastVisibleRecord() + 1;
- if (record > 0) {
+ if (thisWidget && record > 0) {
const QString toolTipText( xi18n("Record: %1", record) );
QToolTip::showText(
QPoint(
diff --git a/src/widget/tableview/kexicomboboxbase.cpp \
b/src/widget/tableview/kexicomboboxbase.cpp index ca8aee7..dc08dc7 100644
--- a/src/widget/tableview/kexicomboboxbase.cpp
+++ b/src/widget/tableview/kexicomboboxbase.cpp
@@ -28,6 +28,7 @@
#include <KDbTableSchema>
+#include <QScopedValueRollback>
#include <QDebug>
KexiComboBoxBase::KexiComboBoxBase()
@@ -377,8 +378,11 @@ void KexiComboBoxBase::createPopup(bool show)
//qDebug() << show << field() << popup() << m_updatePopupSelectionOnShow;
if (!field())
return;
- m_insideCreatePopup = true;
QWidget* thisWidget = dynamic_cast<QWidget*>(this);
+ if (!thisWidget) {
+ return;
+ }
+ QScopedValueRollback<bool> insideCreatePopuRollback(m_insideCreatePopup, true);
QWidget *widgetToFocus = internalEditor() ? internalEditor() : thisWidget;
//qDebug() << "widgetToFocus:" << widgetToFocus;
@@ -465,7 +469,6 @@ void KexiComboBoxBase::createPopup(bool show)
widgetToFocus->setFocus();
}
}
- m_insideCreatePopup = false;
}
void KexiComboBoxBase::hide()
@@ -524,7 +527,9 @@ void KexiComboBoxBase::slotRecordSelected(KDbRecordData*)
if (valueToSet.toString().isEmpty() && !m_insideCreatePopup) {
clear();
QWidget* thisWidget = dynamic_cast<QWidget*>(this);
- thisWidget->parentWidget()->setFocus();
+ if (thisWidget) {
+ thisWidget->parentWidget()->setFocus();
+ }
return;
}
}
diff --git a/src/widget/tableview/kexicomboboxpopup.cpp \
b/src/widget/tableview/kexicomboboxpopup.cpp index 5e55cdc..9663ac0 100644
--- a/src/widget/tableview/kexicomboboxpopup.cpp
+++ b/src/widget/tableview/kexicomboboxpopup.cpp
@@ -182,7 +182,7 @@ void KexiComboBoxPopup::setData(KDbTableViewColumn *column, \
KDbField *field) delete d->privateQuery;
d->privateQuery = 0;
const QList<int> visibleColumns(lookupFieldSchema ? \
lookupFieldSchema->visibleColumns() : QList<int>());
- if (!visibleColumns.isEmpty() && lookupFieldSchema->boundColumn() >= 0) {
+ if (!visibleColumns.isEmpty() && lookupFieldSchema && \
lookupFieldSchema->boundColumn() >= 0) {
const bool multipleLookupColumnJoined = visibleColumns.count() > 1;
//! @todo support more RowSourceType's, not only table and query
KDbCursor *cursor = 0;
diff --git a/src/widget/tableview/kexitableedit.cpp \
b/src/widget/tableview/kexitableedit.cpp index 56ed81c..674d966 100644
--- a/src/widget/tableview/kexitableedit.cpp
+++ b/src/widget/tableview/kexitableedit.cpp
@@ -268,8 +268,8 @@ int KexiTableEdit::widthForValue(const QVariant &val, const \
QFontMetrics &fm) void KexiTableEdit::repaintRelatedCell()
{
#ifndef KEXI_MOBILE
- if (dynamic_cast<KexiDataAwareObjectInterface*>(parentWidget())) {
- dynamic_cast<KexiDataAwareObjectInterface*>(parentWidget())->updateCurrentCell();
+ if (KexiDataAwareObjectInterface *iface = \
dynamic_cast<KexiDataAwareObjectInterface*>(parentWidget())) { + \
iface->updateCurrentCell(); }
#endif
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic