From 2aa7a7f453dd4c65f1c363b6b6149daf5a55b060 Mon Sep 17 00:00:00 2001 From: Vladimir Golovnev Date: Thu, 18 Apr 2024 07:59:24 +0300 Subject: [PATCH] Prevent invalid status filter index from being used PR #20714. Closes #20701. --- src/base/torrentfilter.h | 4 +++- src/gui/transferlistfilters/statusfilterwidget.cpp | 2 +- src/gui/transferlistwidget.cpp | 5 +++-- src/gui/transferlistwidget.h | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/base/torrentfilter.h b/src/base/torrentfilter.h index 3358ef380..4c49d904b 100644 --- a/src/base/torrentfilter.h +++ b/src/base/torrentfilter.h @@ -60,7 +60,9 @@ public: StalledDownloading, Checking, Moving, - Errored + Errored, + + _Count }; // These mean any permutation, including no category / tag. diff --git a/src/gui/transferlistfilters/statusfilterwidget.cpp b/src/gui/transferlistfilters/statusfilterwidget.cpp index 99b00af76..731b4fe52 100644 --- a/src/gui/transferlistfilters/statusfilterwidget.cpp +++ b/src/gui/transferlistfilters/statusfilterwidget.cpp @@ -95,7 +95,7 @@ StatusFilterWidget::StatusFilterWidget(QWidget *parent, TransferListWidget *tran connect(pref, &Preferences::changed, this, &StatusFilterWidget::configure); const int storedRow = pref->getTransSelFilter(); - if (item((storedRow < count()) ? storedRow : 0)->isHidden()) + if (item(((storedRow >= 0) && (storedRow < count())) ? storedRow : 0)->isHidden()) setCurrentRow(TorrentFilter::All, QItemSelectionModel::SelectCurrent); else setCurrentRow(storedRow, QItemSelectionModel::SelectCurrent); diff --git a/src/gui/transferlistwidget.cpp b/src/gui/transferlistwidget.cpp index 38300d05c..ff76167f8 100644 --- a/src/gui/transferlistwidget.cpp +++ b/src/gui/transferlistwidget.cpp @@ -1330,9 +1330,10 @@ void TransferListWidget::applyFilter(const QString &name, const TransferListMode m_sortFilterModel->setFilterRegularExpression(QRegularExpression(pattern, QRegularExpression::CaseInsensitiveOption)); } -void TransferListWidget::applyStatusFilter(int f) +void TransferListWidget::applyStatusFilter(const int filterIndex) { - m_sortFilterModel->setStatusFilter(static_cast(f)); + const auto filterType = static_cast(filterIndex); + m_sortFilterModel->setStatusFilter(((filterType >= TorrentFilter::All) && (filterType < TorrentFilter::_Count)) ? filterType : TorrentFilter::All); // Select first item if nothing is selected if (selectionModel()->selectedRows(0).empty() && (m_sortFilterModel->rowCount() > 0)) { diff --git a/src/gui/transferlistwidget.h b/src/gui/transferlistwidget.h index ad9b0f37b..84a965d4e 100644 --- a/src/gui/transferlistwidget.h +++ b/src/gui/transferlistwidget.h @@ -93,7 +93,7 @@ public slots: void previewSelectedTorrents(); void hideQueuePosColumn(bool hide); void applyFilter(const QString &name, const TransferListModel::Column &type); - void applyStatusFilter(int f); + void applyStatusFilter(int filterIndex); void applyCategoryFilter(const QString &category); void applyTagFilter(const QString &tag); void applyTrackerFilterAll();