diff options
-rw-r--r-- | src/network/core/packet.cpp | 29 | ||||
-rw-r--r-- | src/network/core/packet.h | 1 |
2 files changed, 30 insertions, 0 deletions
diff --git a/src/network/core/packet.cpp b/src/network/core/packet.cpp index 6f56e4a56..736970791 100644 --- a/src/network/core/packet.cpp +++ b/src/network/core/packet.cpp @@ -397,6 +397,35 @@ void Packet::Recv_string(char *buffer, size_t size, StringValidationSettings set } /** + * Reads characters (bytes) from the packet until it finds a '\0', or reaches a + * maximum of \c length characters. + * When the '\0' has not been reached in the first \c length read characters, + * more characters are read from the packet until '\0' has been reached. However, + * these characters will not end up in the returned string. + * The length of the returned string will be at most \c length - 1 characters. + * @param length The maximum length of the string including '\0'. + * @param settings The string validation settings. + * @return The validated string. + */ +std::string Packet::Recv_string(size_t length, StringValidationSettings settings) +{ + assert(length > 1); + + /* Both loops with Recv_uint8 terminate when reading past the end of the + * packet as Recv_uint8 then closes the connection and returns 0. */ + std::string str; + char character; + while (--length > 0 && (character = this->Recv_uint8()) != '\0') str.push_back(character); + + if (length == 0) { + /* The string in the packet was longer. Read until the termination. */ + while (this->Recv_uint8() != '\0') {} + } + + return str_validate(str, settings); +} + +/** * Get the amount of bytes that are still available for the Transfer functions. * @return The number of bytes that still have to be transfered. */ diff --git a/src/network/core/packet.h b/src/network/core/packet.h index 0f58d3be8..21a88e3ea 100644 --- a/src/network/core/packet.h +++ b/src/network/core/packet.h @@ -88,6 +88,7 @@ public: uint32 Recv_uint32(); uint64 Recv_uint64(); void Recv_string(char *buffer, size_t size, StringValidationSettings settings = SVS_REPLACE_WITH_QUESTION_MARK); + std::string Recv_string(size_t length, StringValidationSettings settings = SVS_REPLACE_WITH_QUESTION_MARK); size_t RemainingBytesToTransfer() const; |