From 570a431cfd439558a7848fae0f1487044978668e Mon Sep 17 00:00:00 2001 From: Roland Reichwein Date: Sun, 8 Mar 2026 20:45:30 +0100 Subject: [PATCH] Guard against past-end iterator in etl::rotate() And fix scope of rotate_right_by_one for etl::rotate() --- include/etl/algorithm.h | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/include/etl/algorithm.h b/include/etl/algorithm.h index cb6cbf7a..79024c3d 100644 --- a/include/etl/algorithm.h +++ b/include/etl/algorithm.h @@ -1204,7 +1204,11 @@ namespace etl typename etl::enable_if::value, TIterator>::type rotate_general(TIterator first, TIterator middle, TIterator last) { - if (first == middle || middle == last) + if (first == middle) + { + return last; + } + if (middle == last) { return first; } @@ -1253,7 +1257,11 @@ namespace etl typename etl::enable_if::value, TIterator>::type rotate_general(TIterator first, TIterator middle, TIterator last) { - if (first == middle || middle == last) + if (first == middle) + { + return last; + } + if (middle == last) { return first; } @@ -1275,7 +1283,11 @@ namespace etl typename etl::enable_if::value, TIterator>::type rotate_general(TIterator first, TIterator middle, TIterator last) { - if (first == middle || middle == last) + if (first == middle) + { + return last; + } + if (middle == last) { return first; } @@ -1351,6 +1363,15 @@ namespace etl ETL_CONSTEXPR14 TIterator rotate(TIterator first, TIterator middle, TIterator last) { + if (first == middle) + { + return last; + } + if (middle == last) + { + return first; + } + if (etl::next(first) == middle) { return private_algorithm::rotate_left_by_one(first, last); @@ -1359,7 +1380,7 @@ namespace etl #if ETL_USING_CPP20 if (etl::next(middle) == last) { - if ETL_IF_CONSTEXPR(!etl::is_forward_iterator::value) + if ETL_IF_CONSTEXPR(etl::is_bidirectional_iterator_concept::value) { return private_algorithm::rotate_right_by_one(first, last); }