Skip to content

Commit b0a634e

Browse files
committed
evo: ensure the ADDRV2 serialization is always used in NetInfoEntry
1 parent 6d97bda commit b0a634e

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

src/evo/netinfo.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include <netaddress.h>
99
#include <serialize.h>
10+
#include <streams.h>
1011

1112
#include <variant>
1213

@@ -72,8 +73,9 @@ class NetInfoEntry
7273
bool operator!=(const NetInfoEntry& rhs) const { return !(*this == rhs); }
7374

7475
template <typename Stream>
75-
void Serialize(Stream& s) const
76+
void Serialize(Stream& s_) const
7677
{
78+
OverrideStream<Stream> s(&s_, /*nType=*/0, s_.GetVersion() | ADDRV2_FORMAT);
7779
if (const auto* data_ptr{std::get_if<CService>(&m_data)};
7880
m_type == NetInfoType::Service && data_ptr && data_ptr->IsValid()) {
7981
s << m_type << *data_ptr;
@@ -83,8 +85,9 @@ class NetInfoEntry
8385
}
8486

8587
template <typename Stream>
86-
void Unserialize(Stream& s)
88+
void Unserialize(Stream& s_)
8789
{
90+
OverrideStream<Stream> s(&s_, /*nType=*/0, s_.GetVersion() | ADDRV2_FORMAT);
8891
s >> m_type;
8992
if (m_type == NetInfoType::Service) {
9093
m_data = CService{};

src/test/evo_netinfo_tests.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ BOOST_AUTO_TEST_CASE(netinfo_ser)
9595

9696
{
9797
// A valid CService should be constructable, readable and pass validation
98-
CDataStream ds(SER_DISK, CLIENT_VERSION);
98+
CDataStream ds(SER_DISK, CLIENT_VERSION | ADDRV2_FORMAT);
9999
CService service{LookupNumeric("1.1.1.1", Params().GetDefaultPort())};
100100
BOOST_CHECK(service.IsValid());
101101
NetInfoEntry entry{service}, entry2{};
@@ -105,6 +105,28 @@ BOOST_AUTO_TEST_CASE(netinfo_ser)
105105
BOOST_CHECK(!entry.IsEmpty() && entry.IsTriviallyValid());
106106
BOOST_CHECK(entry.GetAddrPort().value() == service);
107107
}
108+
109+
{
110+
// NetInfoEntry should be able to read and write ADDRV2 addresses
111+
CService service{};
112+
service.SetSpecial("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion");
113+
BOOST_CHECK(service.IsValid() && service.IsTor());
114+
115+
CDataStream ds(SER_DISK, CLIENT_VERSION | ADDRV2_FORMAT);
116+
ds << NetInfoEntry::NetInfoType::Service << service;
117+
ds.SetVersion(CLIENT_VERSION); // Drop the explicit format flag
118+
119+
NetInfoEntry entry{};
120+
ds >> entry;
121+
BOOST_CHECK(!entry.IsEmpty() && entry.IsTriviallyValid());
122+
BOOST_CHECK(entry.GetAddrPort().value() == service);
123+
ds.clear();
124+
125+
NetInfoEntry entry2{};
126+
ds << entry;
127+
ds >> entry2;
128+
BOOST_CHECK(entry == entry2 && entry2.GetAddrPort().value() == service);
129+
}
108130
}
109131

110132
BOOST_AUTO_TEST_CASE(netinfo_retvals)

0 commit comments

Comments
 (0)