Fix out of bounds access within {front|back}_extended_deque with empty deque.

The insertion point is not correct with empty deque since the range
{next_down, next_up} is not half-open range.
This commit is contained in:
Kohei Takahashi
2014-11-30 03:58:20 +09:00
parent d05b854c58
commit ed9880c161
6 changed files with 86 additions and 23 deletions

View File

@ -50,7 +50,7 @@ namespace boost { namespace fusion
typedef bidirectional_traversal_tag category;
typedef mpl::int_<0> size;
typedef mpl::int_<0> next_up;
typedef mpl::int_<0> next_down;
typedef mpl::int_<-1> next_down;
typedef mpl::false_ is_view;
template <typename Sequence>
@ -76,7 +76,7 @@ namespace boost { namespace fusion
typedef typename detail::deque_keyed_values<Head, Tail...>::type base;
typedef mpl::int_<(sizeof ...(Tail) + 1)> size;
typedef mpl::int_<size::value> next_up;
typedef mpl::int_<((size::value == 0) ? 0 : -1)> next_down;
typedef mpl::int_<-1> next_down;
typedef mpl::false_ is_view;
BOOST_FUSION_GPU_ENABLED

View File

@ -11,9 +11,6 @@
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/container/deque/deque_iterator.hpp>
#include <boost/mpl/equal_to.hpp>
#include <boost/mpl/if.hpp>
namespace boost { namespace fusion
{
struct deque_tag;
@ -29,12 +26,8 @@ namespace boost { namespace fusion
template<typename Sequence>
struct apply
{
typedef typename
mpl::if_c<
(Sequence::next_down::value == Sequence::next_up::value)
, deque_iterator<Sequence, 0>
, deque_iterator<Sequence, (Sequence::next_down::value + 1)>
>::type
typedef
deque_iterator<Sequence, (Sequence::next_down::value + 1)>
type;
BOOST_FUSION_GPU_ENABLED

View File

@ -74,8 +74,7 @@ namespace boost { namespace fusion {
typedef typename detail::deque_keyed_values<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, T)>::type base;
typedef typename detail::deque_initial_size<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, T)>::type size;
typedef mpl::int_<size::value> next_up;
typedef mpl::int_<
mpl::if_<mpl::equal_to<size, mpl::int_<0> >, mpl::int_<0>, mpl::int_<-1> >::type::value> next_down;
typedef mpl::int_<-1> next_down;
typedef mpl::false_ is_view;
#include <boost/fusion/container/deque/detail/cpp03/deque_forward_ctor.hpp>
@ -167,7 +166,7 @@ FUSION_HASH endif
typedef bidirectional_traversal_tag category;
typedef mpl::int_<0> size;
typedef mpl::int_<0> next_up;
typedef mpl::int_<0> next_down;
typedef mpl::int_<-1> next_down;
typedef mpl::false_ is_view;
template <typename Sequence>

View File

@ -11,9 +11,6 @@
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/container/deque/deque_iterator.hpp>
#include <boost/mpl/equal_to.hpp>
#include <boost/mpl/if.hpp>
namespace boost { namespace fusion
{
struct deque_tag;
@ -29,12 +26,8 @@ namespace boost { namespace fusion
template<typename Sequence>
struct apply
{
typedef typename
mpl::if_c<
(Sequence::next_down::value == Sequence::next_up::value)
, deque_iterator<Sequence, 0>
, deque_iterator<Sequence, Sequence::next_up::value>
>::type
typedef
deque_iterator<Sequence, Sequence::next_up::value>
type;
BOOST_FUSION_GPU_ENABLED