Files
ResInsight/Fwk/AppFwk/cafUserInterface/cafUserInterface_UnitTests/cafPdmUiTableViewQModelTest.cpp
T
Magne Sjaastad 656944c6fc #14453 Guard against invalid model index in table view
Dropping on an empty area of a table view calls dropMimeData with an invalid parent index, where row and column are -1. PdmUiTableViewQModel::getField() and pdmObjectForRow() used these values to index the child array field, reading out of bounds and returning a garbage object pointer.
2026-08-05 09:18:31 +02:00

62 lines
1.7 KiB
C++

#include "gtest/gtest.h"
#include "cafPdmChildArrayField.h"
#include "cafPdmField.h"
#include "cafPdmObject.h"
#include "cafPdmUiTableViewQModel.h"
#include <QModelIndex>
using namespace caf;
class TableRowObject : public caf::PdmObject
{
CAF_PDM_HEADER_INIT;
public:
TableRowObject()
{
CAF_PDM_InitObject( "TableRowObject" );
CAF_PDM_InitField( &m_value, "Value", 1.0, "Value" );
}
caf::PdmField<double> m_value;
};
CAF_PDM_SOURCE_INIT( TableRowObject, "TableRowObject" );
class TableContainerObject : public caf::PdmObject
{
CAF_PDM_HEADER_INIT;
public:
TableContainerObject()
{
CAF_PDM_InitObject( "TableContainerObject" );
CAF_PDM_InitFieldNoDefault( &m_rows, "Rows", "Rows" );
}
caf::PdmChildArrayField<TableRowObject*> m_rows;
};
CAF_PDM_SOURCE_INIT( TableContainerObject, "TableContainerObject" );
//--------------------------------------------------------------------------------------------------
/// An invalid model index has row and column set to -1, and must not be used to index the child array
//--------------------------------------------------------------------------------------------------
TEST( PdmUiTableViewQModelTest, InvalidModelIndex )
{
TableContainerObject container;
container.m_rows.push_back( new TableRowObject );
PdmUiTableViewQModel model( nullptr );
model.setArrayFieldAndBuildEditors( &container.m_rows, "" );
EXPECT_EQ( 1, model.rowCount() );
QModelIndex invalidIndex;
EXPECT_FALSE( invalidIndex.isValid() );
EXPECT_EQ( nullptr, model.getField( invalidIndex ) );
EXPECT_EQ( nullptr, model.pdmObjectForRow( invalidIndex.row() ) );
}