From c1fa4a7f8c6d30442815b095f92d1c8fb66936f3 Mon Sep 17 00:00:00 2001 From: moneromooo-monero Date: Thu, 16 May 2019 14:56:20 +0000 Subject: [PATCH] boost: fix little/big endian compatibility When no little/big endian flag is given to the writer, it stores data in host endianness. When loading, if no flag is set, it also assumes host endianness. This works as long as the loading and writing are done on machines with the same endianness. We change this to default to little endian when saving. This will cause the loader to see the little endian flag, and swap endianness when loading on a big endian machine. Similarly, writing on a big endian machine will swap on save, and a little endian machine will load little endian data. --- external/boost/archive/portable_binary_iarchive.hpp | 4 +++- external/boost/archive/portable_binary_oarchive.hpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/external/boost/archive/portable_binary_iarchive.hpp b/external/boost/archive/portable_binary_iarchive.hpp index bd19599f3..d17e95c05 100644 --- a/external/boost/archive/portable_binary_iarchive.hpp +++ b/external/boost/archive/portable_binary_iarchive.hpp @@ -258,7 +258,7 @@ portable_binary_iarchive::load_impl(boost::intmax_t & l, char maxsize){ this->primitive_base_t::load_binary(cptr, size); #if BOOST_ENDIAN_BIG_BYTE - if(m_flags & endian_little) + if((m_flags & endian_little) || (!(m_flags & endian_big))) #else if(m_flags & endian_big) #endif @@ -343,6 +343,8 @@ portable_binary_iarchive::init(unsigned int flags){ ); #endif } + if (!(m_flags & (endian_little | endian_big))) + m_flags |= endian_little; unsigned char x; load(x); m_flags = x << CHAR_BIT; diff --git a/external/boost/archive/portable_binary_oarchive.hpp b/external/boost/archive/portable_binary_oarchive.hpp index 783c7f7c9..a0ac0a9b5 100644 --- a/external/boost/archive/portable_binary_oarchive.hpp +++ b/external/boost/archive/portable_binary_oarchive.hpp @@ -171,7 +171,7 @@ protected: void init(unsigned int flags); public: - portable_binary_oarchive(std::ostream & os, unsigned flags = 0) : + portable_binary_oarchive(std::ostream & os, unsigned flags = endian_little) : primitive_base_t( * os.rdbuf(), 0 != (flags & boost::archive::no_codecvt)