Avoid memory corruption when accessing private instance of header view

The private instance of the header view has not been properly
initialized and this may lead to accessing invalid memory. Thanks to CI,
which caught this issue (while running in release with debug info).

This patch properly initializes the header view with their
corresponding private instance.

Pick-to: 6.8
Change-Id: Iaf42c5e70c404786d8c2dfe03d9265551956d6fa
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
This commit is contained in:
Santhosh Kumar 2024-08-08 17:42:26 +02:00
parent d41361c323
commit 20260da535
2 changed files with 22 additions and 9 deletions

View File

@ -89,6 +89,15 @@ QQuickHeaderViewBasePrivate::~QQuickHeaderViewBasePrivate()
{
}
void QQuickHeaderViewBasePrivate::init()
{
Q_Q(QQuickHeaderViewBase);
m_headerDataProxyModel.m_headerView = q;
setSizePolicy(orientation() == Qt::Horizontal ? QLayoutPolicy::Preferred : QLayoutPolicy::Fixed,
orientation() == Qt::Horizontal ? QLayoutPolicy::Fixed : QLayoutPolicy::Preferred);
q->setSyncDirection(orientation());
}
const QPointer<QQuickItem> QQuickHeaderViewBasePrivate::delegateItemAt(int row, int col) const
{
return loadedTableItem(QPoint(col, row))->item;
@ -211,18 +220,15 @@ QQuickHeaderViewBase::QQuickHeaderViewBase(Qt::Orientation orient, QQuickItem *p
: QQuickTableView(*(new QQuickHeaderViewBasePrivate), parent)
{
Q_D(QQuickHeaderViewBase);
d->m_headerDataProxyModel.m_headerView = this;
d->setSizePolicy(orient == Qt::Horizontal ? QLayoutPolicy::Preferred : QLayoutPolicy::Fixed,
orient == Qt::Horizontal ? QLayoutPolicy::Fixed : QLayoutPolicy::Preferred);
d->setOrientation(orient);
setSyncDirection(orient);
d->init();
}
QQuickHeaderViewBase::QQuickHeaderViewBase(QQuickHeaderViewBasePrivate &dd, QQuickItem *parent)
: QQuickTableView(dd, parent)
{
Q_D(QQuickHeaderViewBase);
d->m_headerDataProxyModel.m_headerView = this;
d->init();
}
QQuickHeaderViewBase::~QQuickHeaderViewBase()
@ -441,7 +447,7 @@ void QHeaderDataProxyModel::disconnectFromModel()
}
QQuickHorizontalHeaderView::QQuickHorizontalHeaderView(QQuickItem *parent)
: QQuickHeaderViewBase(Qt::Horizontal, parent)
: QQuickHeaderViewBase(*(new QQuickHorizontalHeaderViewPrivate), parent)
{
setFlickableDirection(FlickableDirection::HorizontalFlick);
setResizableColumns(true);
@ -476,7 +482,7 @@ void QQuickHorizontalHeaderView::setMovableColumns(bool movableColumns)
}
QQuickVerticalHeaderView::QQuickVerticalHeaderView(QQuickItem *parent)
: QQuickHeaderViewBase(Qt::Vertical, parent)
: QQuickHeaderViewBase(*(new QQuickVerticalHeaderViewPrivate), parent)
{
setFlickableDirection(FlickableDirection::VerticalFlick);
setResizableRows(true);
@ -510,11 +516,17 @@ void QQuickVerticalHeaderView::setMovableRows(bool movableRows)
emit movableRowsChanged();
}
QQuickHorizontalHeaderViewPrivate::QQuickHorizontalHeaderViewPrivate() = default;
QQuickHorizontalHeaderViewPrivate::QQuickHorizontalHeaderViewPrivate()
{
setOrientation(Qt::Horizontal);
};
QQuickHorizontalHeaderViewPrivate::~QQuickHorizontalHeaderViewPrivate() = default;
QQuickVerticalHeaderViewPrivate::QQuickVerticalHeaderViewPrivate() = default;
QQuickVerticalHeaderViewPrivate::QQuickVerticalHeaderViewPrivate()
{
setOrientation(Qt::Vertical);
};
QQuickVerticalHeaderViewPrivate::~QQuickVerticalHeaderViewPrivate() = default;

View File

@ -66,6 +66,7 @@ public:
QQuickHeaderViewBasePrivate();
~QQuickHeaderViewBasePrivate();
void init();
Qt::Orientation orientation() const;
void setOrientation(Qt::Orientation orientation);
const QPointer<QQuickItem> delegateItemAt(int row, int col) const;