From 14fb3baf6364986d097d6543c56ca3b240eb082c Mon Sep 17 00:00:00 2001 From: Lennart Braun Date: Mon, 17 Oct 2016 22:15:49 +0200 Subject: [PATCH] menu: fixed rcurrent iterators on empty menus If m_items is empty, ++current() did result in an invalid iterator (pointing behind end()). --- NEWS | 3 +++ src/menu.h | 28 ++++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 4bb28297..522294a3 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,6 @@ +ncmpcpp-0.7.6 (????-??-??) +* Fixed assertion failure on trying to search backwards in an empty list. + ncmpcpp-0.7.5 (2016-08-17) * Action chains can be now used for seeking. * Fixed fetching artist info from last.fm. diff --git a/src/menu.h b/src/menu.h index c7410bce..d2783423 100644 --- a/src/menu.h +++ b/src/menu.h @@ -353,13 +353,33 @@ template struct Menu : Window, List Iterator current() { return Iterator(m_items.begin() + m_highlight); } ConstIterator current() const { return ConstIterator(m_items.begin() + m_highlight); } - ReverseIterator rcurrent() { return ReverseIterator(++current()); } - ConstReverseIterator rcurrent() const { return ReverseIterator(++current()); } + ReverseIterator rcurrent() { + if (empty()) + return rend(); + else + return ReverseIterator(++current()); + } + ConstReverseIterator rcurrent() const { + if (empty()) + return rend(); + else + return ConstReverseIterator(++current()); + } ValueIterator currentV() { return ValueIterator(m_items.begin() + m_highlight); } ConstValueIterator currentV() const { return ConstValueIterator(m_items.begin() + m_highlight); } - ReverseValueIterator rcurrentV() { return ReverseValueIterator(++currentV()); } - ConstReverseValueIterator rcurrentV() const { return ConstReverseValueIterator(++currentV()); } + ReverseValueIterator rcurrentV() { + if (empty()) + return rendV(); + else + return ReverseValueIterator(++currentV()); + } + ConstReverseValueIterator rcurrentV() const { + if (empty()) + return rendV(); + else + return ConstReverseValueIterator(++currentV()); + } Iterator begin() { return Iterator(m_items.begin()); } ConstIterator begin() const { return ConstIterator(m_items.begin()); }