Opened 4 years ago
#13563 new Patches
Error deserializing empty forward_list
| Reported by: | Owned by: | Robert Ramey | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | serialization | 
| Version: | Boost 1.67.0 | Severity: | Showstopper | 
| Keywords: | Cc: | 
Description
Deserializing an empty forward_list is broken if the elements aren't default constructible (with old compilers it's enough that elements have a non-trivial default constructor).
A patch is attached. The problem is that the first element is always loaded first, even if the list is empty. The result may be a crash or any undefined behavior, since deserialization goes out of sync.
Test case:
#include <boost/serialization/forward_list.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <forward_list>
#include <iostream>
#include <sstream>
struct Foo
{
  int x;
  Foo(int a) : x(a) {};
  template<class Archive>
  void serialize(Archive& ar, const unsigned int) { ar & x; }
private:
  friend class boost::serialization::access;
  Foo() = default;
};
int main()
{
  std::forward_list<Foo> flist;
  std::ostringstream oss;
  boost::archive::binary_oarchive oa{oss};
  oa << flist;
  std::istringstream iss{oss.str()};
  boost::archive::binary_iarchive ia{iss};
  ia >> flist;
}
Results in:
terminate called after throwing an instance of 'boost::archive::archive_exception' what(): input stream error Aborted (core dumped)
Attachments (1)
  Note:
 See   TracTickets
 for help on using tickets.
    
