[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