diff --git a/src/command_aux.h b/src/command_aux.h index 0d19082781..f9af2884da 100644 --- a/src/command_aux.h +++ b/src/command_aux.h @@ -62,7 +62,7 @@ struct CommandAuxiliarySerialised : public CommandAuxiliaryBase { virtual std::optional> GetDeserialisationSrc() const override { return span(this->serialised_data.data(), this->serialised_data.size()); } - virtual void Serialise(CommandSerialisationBuffer &buffer) const override { buffer.Send_binary((const char *)this->serialised_data.data(), this->serialised_data.size()); } + virtual void Serialise(CommandSerialisationBuffer &buffer) const override { buffer.Send_binary(this->serialised_data.data(), this->serialised_data.size()); } }; template diff --git a/src/core/serialisation.cpp b/src/core/serialisation.cpp index 94a0dea161..775416db30 100644 --- a/src/core/serialisation.cpp +++ b/src/core/serialisation.cpp @@ -119,7 +119,7 @@ void BufferSend_string(std::vector &buffer, size_t limit, const std::strin * @param end The end of the buffer to send. * @return The number of bytes that were added to this packet. */ -size_t BufferSend_bytes(std::vector &buffer, size_t limit, const byte *begin, const byte *end) +size_t BufferSend_binary_until_full(std::vector &buffer, size_t limit, const byte *begin, const byte *end) { size_t amount = std::min(end - begin, limit - buffer.size()); buffer.insert(buffer.end(), begin, begin + amount); @@ -130,7 +130,7 @@ size_t BufferSend_bytes(std::vector &buffer, size_t limit, const byte *beg * Sends a binary data over the network. * @param data The data to send */ -void BufferSend_binary(std::vector &buffer, size_t limit, const char *data, const size_t size) +void BufferSend_binary(std::vector &buffer, size_t limit, const byte *data, const size_t size) { assert(data != nullptr); assert(BufferCanWriteToPacket(buffer, limit, size)); diff --git a/src/core/serialisation.hpp b/src/core/serialisation.hpp index 33b962bd56..13bd45b0be 100644 --- a/src/core/serialisation.hpp +++ b/src/core/serialisation.hpp @@ -16,6 +16,7 @@ #include #include +#include void BufferSend_bool (std::vector &buffer, size_t limit, bool data); void BufferSend_uint8 (std::vector &buffer, size_t limit, uint8 data); @@ -23,8 +24,8 @@ void BufferSend_uint16(std::vector &buffer, size_t limit, uint16 data); void BufferSend_uint32(std::vector &buffer, size_t limit, uint32 data); void BufferSend_uint64(std::vector &buffer, size_t limit, uint64 data); void BufferSend_string(std::vector &buffer, size_t limit, const std::string_view data); -size_t BufferSend_bytes (std::vector &buffer, size_t limit, const byte *begin, const byte *end); -void BufferSend_binary(std::vector &buffer, size_t limit, const char *data, const size_t size); +size_t BufferSend_binary_until_full(std::vector &buffer, size_t limit, const byte *begin, const byte *end); +void BufferSend_binary(std::vector &buffer, size_t limit, const byte *data, const size_t size); void BufferSend_buffer(std::vector &buffer, size_t limit, const byte *data, const size_t size); template @@ -65,18 +66,23 @@ struct BufferSerialisationHelper { BufferSend_string(self->GetSerialisationBuffer(), self->GetSerialisationLimit(), data); } - size_t Send_bytes(const byte *begin, const byte *end) + size_t Send_binary_until_full(const byte *begin, const byte *end) { T *self = static_cast(this); - return BufferSend_bytes(self->GetSerialisationBuffer(), self->GetSerialisationLimit(), begin, end); + return BufferSend_binary_until_full(self->GetSerialisationBuffer(), self->GetSerialisationLimit(), begin, end); } - void Send_binary(const char *data, const size_t size) + void Send_binary(const byte *data, const size_t size) { T *self = static_cast(this); BufferSend_binary(self->GetSerialisationBuffer(), self->GetSerialisationLimit(), data, size); } + void Send_binary(const byte *data, const byte *end) + { + this->Send_binary(data, end - data); + } + void Send_buffer(const byte *data, const size_t size) { T *self = static_cast(this); @@ -247,7 +253,7 @@ public: * @param buffer The buffer to put the data into. * @param size The size of the data. */ - void Recv_binary(char *buffer, size_t size) + void Recv_binary(byte *buffer, size_t size) { if (!this->CanRecvBytes(size, true)) return; @@ -262,14 +268,16 @@ public: * @param buffer The buffer to put the data into. * @param size The size of the data. */ - void Recv_binary(std::string &buffer, size_t size) + std::vector Recv_binary(size_t size) { - if (!this->CanRecvBytes(size, true)) return; + if (!this->CanRecvBytes(size, true)) return {}; auto &pos = static_cast(this)->GetDeserialisationPosition(); - buffer.assign((const char *) &this->GetBuffer()[pos], size); + std::vector buffer { &this->GetBuffer()[pos], &this->GetBuffer()[pos + size] }; pos += (decltype(pos)) size; + + return buffer; } /** @@ -290,4 +298,13 @@ public: } }; +struct BufferSerialiser : public BufferSerialisationHelper { + std::vector &buffer; + + BufferSerialiser(std::vector &buffer) : buffer(buffer) {} + + std::vector &GetSerialisationBuffer() { return this->buffer; } + size_t GetSerialisationLimit() const { return std::numeric_limits::max(); } +}; + #endif /* SERIALISATION_HPP */ diff --git a/src/network/core/udp.cpp b/src/network/core/udp.cpp index 4eecd59894..e07b1d950a 100644 --- a/src/network/core/udp.cpp +++ b/src/network/core/udp.cpp @@ -97,7 +97,7 @@ void NetworkUDPSocketHandler::SendPacket(Packet *p, NetworkAddress *recv, bool a frag.Send_uint8 (current_frag); frag.Send_uint8 (frag_count); frag.Send_uint16 (payload_size); - frag.Send_binary((const char *) p->GetBufferData() + offset, payload_size); + frag.Send_binary(p->GetBufferData() + offset, payload_size); current_frag++; offset += payload_size; this->SendPacket(&frag, recv, all, broadcast, short_mtu); @@ -239,7 +239,7 @@ void NetworkUDPSocketHandler::Receive_EX_MULTI(Packet *p, NetworkAddress *client Packet merged(this, SHRT_MAX, 0); merged.ReserveBuffer(total_payload); for (auto &frag : fs.fragments) { - merged.Send_binary(frag.data(), frag.size()); + merged.Send_binary((const byte *)frag.data(), frag.size()); } merged.ParsePacketSize(); merged.PrepareToRead(); diff --git a/src/network/network.cpp b/src/network/network.cpp index 6c457036ea..7ba9d3f196 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -223,15 +223,6 @@ std::string GenerateCompanyPasswordHash(const std::string &password, const std:: return hashed_password.str(); } -struct HashBuffer : public BufferSerialisationHelper { - std::vector &buffer; - - HashBuffer(std::vector &buffer) : buffer(buffer) {} - - std::vector &GetSerialisationBuffer() { return this->buffer; } - size_t GetSerialisationLimit() const { return UINT32_MAX; } -}; - /** * Hash the given password using server ID and game seed. * @param password Password to hash. @@ -245,7 +236,7 @@ std::vector GenerateGeneralPasswordHash(const std::string &password, cons std::vector data; data.reserve(password.size() + password_server_id.size() + 6); - HashBuffer buffer(data); + BufferSerialiser buffer(data); /* key field */ buffer.Send_uint64(password_game_seed); diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 9d405eb5d8..a4aaf5c111 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -557,7 +557,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendDesyncLog(const std::strin Packet *p = new Packet(PACKET_CLIENT_DESYNC_LOG, SHRT_MAX); size_t size = std::min(log.size() - offset, SHRT_MAX - 2 - p->Size()); p->Send_uint16((uint16)size); - p->Send_binary(log.data() + offset, size); + p->Send_binary((const byte *)(log.data() + offset), size); my_client->SendPacket(p); offset += size; @@ -1175,7 +1175,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_DESYNC_LOG(Pack { uint size = p->Recv_uint16(); this->server_desync_log.resize(this->server_desync_log.size() + size); - p->Recv_binary(this->server_desync_log.data() + this->server_desync_log.size() - size, size); + p->Recv_binary((byte *)(this->server_desync_log.data() + this->server_desync_log.size() - size), size); DEBUG(net, 2, "Received %u bytes of server desync log", size); return NETWORK_RECV_STATUS_OKAY; } diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp index 6e763d9fb9..edbba09512 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -343,7 +343,7 @@ const char *NetworkGameSocketHandler::ReceiveCommand(Packet *p, CommandPacket *c CommandAuxiliarySerialised *aux_data = new CommandAuxiliarySerialised(); cp->aux_data.reset(aux_data); aux_data->serialised_data.resize(aux_data_size); - p->Recv_binary((char *)(aux_data->serialised_data.data()), aux_data_size); + p->Recv_binary((aux_data->serialised_data.data()), aux_data_size); } return nullptr; diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 8d5ce6a5c3..ad65e00e2c 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -160,7 +160,7 @@ struct PacketWriter : SaveFilter { byte *bufe = buf + size; while (buf != bufe) { - size_t written = this->current->Send_bytes(buf, bufe); + size_t written = this->current->Send_binary_until_full(buf, bufe); buf += written; if (!this->current->CanWriteToPacket(1)) { @@ -452,7 +452,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendDesyncLog(const std::strin Packet *p = new Packet(PACKET_SERVER_DESYNC_LOG, SHRT_MAX); size_t size = std::min(log.size() - offset, SHRT_MAX - 2 - p->Size()); p->Send_uint16(static_cast(size)); - p->Send_binary(log.data() + offset, size); + p->Send_binary((const byte *)(log.data() + offset), size); this->SendPacket(p); offset += size; @@ -1246,7 +1246,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_DESYNC_LOG(Pack { uint size = p->Recv_uint16(); this->desync_log.resize(this->desync_log.size() + size); - p->Recv_binary(this->desync_log.data() + this->desync_log.size() - size, size); + p->Recv_binary((byte *)(this->desync_log.data() + this->desync_log.size() - size), size); DEBUG(net, 2, "Received %u bytes of client desync log", size); this->receive_limit += p->Size(); return NETWORK_RECV_STATUS_OKAY;