Skip to content

Commit a60298d

Browse files
authored
protocol fields serialization fix (#85)
* protocol fields serialization fix Signed-off-by: iceseer <[email protected]> * fixup! Signed-off-by: iceseer <[email protected]> * issues fixup! Signed-off-by: iceseer <[email protected]> * fixup! Signed-off-by: iceseer <[email protected]>
1 parent 0b49b14 commit a60298d

File tree

6 files changed

+47
-13
lines changed

6 files changed

+47
-13
lines changed

include/libp2p/multi/converters/converter_utils.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <string>
1010
#include <vector>
1111

12+
#include <gsl/span>
1213
#include <libp2p/common/types.hpp>
1314
#include <libp2p/multi/multiaddress_protocol_list.hpp>
1415
#include <libp2p/outcome/outcome.hpp>
@@ -38,6 +39,14 @@ namespace libp2p::multi::converters {
3839
auto bytesToMultiaddrString(const common::ByteArray &bytes)
3940
-> outcome::result<std::string>;
4041

42+
/**
43+
* Converts the given byte sequence representing
44+
* a multiaddr to a string containing the multiaddr in a human-readable
45+
* format, if the provided byte sequence was a valid multiaddr
46+
*/
47+
auto bytesToMultiaddrString(gsl::span<const uint8_t> bytes)
48+
-> outcome::result<std::string>;
49+
4150
} // namespace libp2p::multi::converters
4251

4352
#endif // LIBP2P_CONVERTER_UTILS_HPP

include/libp2p/multi/multiaddress.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <string_view>
1414
#include <unordered_map>
1515

16+
#include <gsl/span>
1617
#include <boost/optional.hpp>
1718
#include <libp2p/common/types.hpp>
1819
#include <libp2p/multi/multiaddress_protocol_list.hpp>
@@ -53,6 +54,14 @@ namespace libp2p::multi {
5354
*/
5455
static FactoryResult create(const ByteBuffer &bytes);
5556

57+
/**
58+
* Construct a multiaddress instance from the bytes
59+
* @param bytes to be in that multiaddress
60+
* @return pointer to Multiaddress, if creation is successful, error
61+
* otherwise
62+
*/
63+
static FactoryResult create(gsl::span<const uint8_t> bytes);
64+
5665
/**
5766
* Encapsulate a multiaddress to this one, such that:
5867
* '/ip4/192.168.0.1' after encapsulation with '/udp/138' becomes

src/multi/converters/converter_utils.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ namespace libp2p::multi::converters {
112112
}
113113
}
114114

115-
outcome::result<std::string> bytesToMultiaddrString(const ByteArray &bytes) {
115+
outcome::result<std::string> bytesToMultiaddrString(gsl::span<const uint8_t> bytes) {
116116
std::string results;
117117

118118
size_t lastpos = 0;
@@ -121,7 +121,7 @@ namespace libp2p::multi::converters {
121121
const std::string hex = hex_upper(bytes);
122122

123123
// Process Hex String
124-
while (lastpos < bytes.size() * 2) {
124+
while (lastpos < (size_t)bytes.size() * 2) {
125125
gsl::span<const uint8_t, -1> pid_bytes{bytes};
126126
int protocol_int = UVarint(pid_bytes.subspan(lastpos / 2)).toUInt64();
127127
Protocol const *protocol =
@@ -192,4 +192,7 @@ namespace libp2p::multi::converters {
192192
return results;
193193
}
194194

195+
outcome::result<std::string> bytesToMultiaddrString(const ByteArray &bytes) {
196+
return bytesToMultiaddrString(gsl::span<const uint8_t>(bytes));
197+
}
195198
} // namespace libp2p::multi::converters

src/multi/multiaddress.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,18 @@ namespace libp2p::multi {
6666
ByteBuffer{std::vector<uint8_t>{bytes.begin(), bytes.end()}}};
6767
}
6868

69-
Multiaddress::FactoryResult Multiaddress::create(const ByteBuffer &bytes) {
70-
// convert bytes address to string and make sure it represents valid address
69+
Multiaddress::FactoryResult Multiaddress::create(gsl::span<const uint8_t> bytes) {
7170
auto conversion_res = converters::bytesToMultiaddrString(bytes);
7271
if (!conversion_res) {
7372
return Error::INVALID_INPUT;
7473
}
7574

7675
std::string s = conversion_res.value();
77-
return Multiaddress{std::move(s), ByteBuffer{bytes}};
76+
return Multiaddress{std::move(s), ByteBuffer(bytes.begin(), bytes.end())};
77+
}
78+
79+
Multiaddress::FactoryResult Multiaddress::create(const ByteBuffer &bytes) {
80+
return create(gsl::span<const uint8_t>(bytes));
7881
}
7982

8083
Multiaddress::Multiaddress(std::string &&address, ByteBuffer &&bytes)

src/protocol/identify/identify_msg_processor.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,17 @@
1414
#include <libp2p/protocol/identify/utils.hpp>
1515
#include <generated/protocol/identify/protobuf/identify.pb.h>
1616

17+
namespace {
18+
inline std::string fromMultiaddrToString(const libp2p::multi::Multiaddress &ma) {
19+
auto const &addr = ma.getBytesAddress();
20+
return std::string(reinterpret_cast<const char*>(addr.data()), addr.size()); // NOLINT
21+
}
22+
23+
inline libp2p::outcome::result<libp2p::multi::Multiaddress> fromStringToMultiaddr(const std::string &addr) {
24+
return libp2p::multi::Multiaddress::create(gsl::span<const uint8_t>(reinterpret_cast<const uint8_t*>(addr.data()), addr.size())); // NOLINT
25+
}
26+
}
27+
1728
namespace libp2p::protocol {
1829
IdentifyMessageProcessor::IdentifyMessageProcessor(
1930
Host &host, network::ConnectionManager &conn_manager,
@@ -42,13 +53,13 @@ namespace libp2p::protocol {
4253
// set an address of the other side, so that it knows, which address we used
4354
// to connect to it
4455
if (auto remote_addr = stream->remoteMultiaddr()) {
45-
msg.set_observedaddr(std::string{remote_addr.value().getStringAddress()});
56+
msg.set_observedaddr(fromMultiaddrToString(remote_addr.value()));
4657
}
4758

4859
// set addresses we are listening on
4960
for (const auto &addr :
5061
host_.getNetwork().getListener().getListenAddresses()) {
51-
msg.add_listenaddrs(std::string{addr.getStringAddress()});
62+
msg.add_listenaddrs(fromMultiaddrToString(addr));
5263
}
5364

5465
// set our public key
@@ -267,7 +278,7 @@ namespace libp2p::protocol {
267278
return;
268279
}
269280

270-
auto address_res = multi::Multiaddress::create(address_str);
281+
auto address_res = fromStringToMultiaddr(address_str);
271282
if (!address_res) {
272283
return log_->error("peer {} has send an invalid observed address",
273284
peer_id.toBase58());
@@ -319,7 +330,7 @@ namespace libp2p::protocol {
319330

320331
std::vector<multi::Multiaddress> listen_addresses;
321332
for (const auto &addr_str : addresses_strings) {
322-
auto addr_res = multi::Multiaddress::create(addr_str);
333+
auto addr_res = fromStringToMultiaddr(addr_str);
323334
if (!addr_res) {
324335
log_->error("peer {} has sent an invalid listen address",
325336
peer_id.toBase58());

test/libp2p/protocol/identify_test.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ class IdentifyTest : public testing::Test {
5151
identify_pb_msg_.add_protocols(proto);
5252
}
5353
identify_pb_msg_.set_observedaddr(
54-
std::string{remote_multiaddr_.getStringAddress()});
54+
std::string{(const char*)remote_multiaddr_.getBytesAddress().data(), remote_multiaddr_.getBytesAddress().size()});
5555
for (const auto &addr : listen_addresses_) {
56-
identify_pb_msg_.add_listenaddrs(std::string{addr.getStringAddress()});
56+
identify_pb_msg_.add_listenaddrs(std::string{(const char*)addr.getBytesAddress().data(), addr.getBytesAddress().size()});
5757
}
5858
identify_pb_msg_.set_publickey(marshalled_pubkey_.data(),
5959
marshalled_pubkey_.size());
@@ -207,8 +207,7 @@ TEST_F(IdentifyTest, Receive) {
207207
.WillOnce(ReturnStreamRes(std::static_pointer_cast<Stream>(stream_)));
208208

209209
EXPECT_CALL(*stream_, read(_, 1, _))
210-
.WillOnce(ReadPut(gsl::make_span(identify_pb_msg_bytes_.data(), 1)))
211-
.WillOnce(ReadPut(gsl::make_span(identify_pb_msg_bytes_.data() + 1, 1)));
210+
.WillOnce(ReadPut(gsl::make_span(identify_pb_msg_bytes_.data(), 1)));
212211
EXPECT_CALL(*stream_, read(_, pb_msg_len_varint_->toUInt64(), _))
213212
.WillOnce(ReadPut(gsl::make_span(
214213
identify_pb_msg_bytes_.data() + pb_msg_len_varint_->size(),

0 commit comments

Comments
 (0)