Opened 14 years ago

Closed 14 years ago

#2685 closed Bugs (wontfix)

[serialization][variant]Deserializing 'which' should check for values less than 0

Reported by: Nevin ":-)" Liber <nevin@…> Owned by: Robert Ramey
Milestone: Boost 1.38.0 Component: serialization
Version: Boost 1.37.0 Severity: Problem
Keywords: Cc:

Description

In <boost/serialization/variant.hpp>:

template<class Archive, BOOST_VARIANT_ENUM_PARAMS(/* typename */ class T)>

void load(
    Archive & ar, 
    boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>& v,
    unsigned int version
){      
    int which;
    typedef BOOST_DEDUCED_TYPENAME boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types types;
    ar >> BOOST_SERIALIZATION_NVP(which);
    if(which >=  mpl::size<types>::value)
        // this might happen if a type was removed from the list of variant types
        boost::serialization::throw_exception(
            boost::archive::archive_exception(
                boost::archive::archive_exception::unsupported_version
            )
        );
       //...

Since 'which' is an int, there should be a check and an exception thrown if which < 0.

Change History (1)

comment:1 by Robert Ramey, 14 years ago

Resolution: wontfix
Status: newclosed

how could which ever be less than zero? If this were to occur, there is a fundamental programmer error from which no recovery is possible.

maybe an assert would be appropriate - but throwing an exception would not be.

In fact, this makes me question the usage of throwing an exception in the current code. This means that the programmer has removed a type from the variant which is still used in some archives. At this point, one cannot not expect to be able to load old archives.

Robert Ramey

Note: See TracTickets for help on using tickets.