# HG changeset patch # User rubidium42 # Date 2021-06-13 21:41:15 # Node ID 4e6b21bba5fc06c5ab5f3af59c868ddd19fc485d # Parent bb09d6722f4efb2de885e2af03f267b9543b0565 Codechange: [Network] Use string_view for network compatability check diff --git a/src/network/core/game_info.cpp b/src/network/core/game_info.cpp --- a/src/network/core/game_info.cpp +++ b/src/network/core/game_info.cpp @@ -38,7 +38,7 @@ NetworkServerGameInfo _network_game_info * Get the network version string used by this build. * The returned string is guaranteed to be at most NETWORK_REVISON_LENGTH bytes including '\0' terminator. */ -const char *GetNetworkRevisionString() +std::string_view GetNetworkRevisionString() { static std::string network_revision; @@ -65,17 +65,19 @@ const char *GetNetworkRevisionString() Debug(net, 3, "Network revision name: {}", network_revision); } - return network_revision.c_str(); + return network_revision; } /** * Extract the git hash from the revision string. - * @param revstr The revision string (formatted as DATE-BRANCH-GITHASH). + * @param revision_string The revision string (formatted as DATE-BRANCH-GITHASH). * @return The git has part of the revision. */ -static const char *ExtractNetworkRevisionHash(const char *revstr) +static std::string_view ExtractNetworkRevisionHash(std::string_view revision_string) { - return strrchr(revstr, '-'); + size_t index = revision_string.find_last_of('-'); + if (index == std::string::npos) return {}; + return revision_string.substr(index); } /** @@ -83,18 +85,18 @@ static const char *ExtractNetworkRevisio * First tries to match the full string, if that fails, attempts to compare just git hashes. * @param other the version string to compare to */ -bool IsNetworkCompatibleVersion(const char *other) +bool IsNetworkCompatibleVersion(std::string_view other) { - if (strncmp(GetNetworkRevisionString(), other, NETWORK_REVISION_LENGTH - 1) == 0) return true; + if (GetNetworkRevisionString() == other) return true; /* If this version is tagged, then the revision string must be a complete match, * since there is no git hash suffix in it. * This is needed to avoid situations like "1.9.0-beta1" comparing equal to "2.0.0-beta1". */ if (_openttd_revision_tagged) return false; - const char *hash1 = ExtractNetworkRevisionHash(GetNetworkRevisionString()); - const char *hash2 = ExtractNetworkRevisionHash(other); - return hash1 != nullptr && hash2 != nullptr && strncmp(hash1, hash2, GITHASH_SUFFIX_LEN) == 0; + std::string_view hash1 = ExtractNetworkRevisionHash(GetNetworkRevisionString()); + std::string_view hash2 = ExtractNetworkRevisionHash(other); + return hash1 == hash2; } /** @@ -103,7 +105,7 @@ bool IsNetworkCompatibleVersion(const ch void CheckGameCompatibility(NetworkGameInfo &ngi) { /* Check if we are allowed on this server based on the revision-check. */ - ngi.version_compatible = IsNetworkCompatibleVersion(ngi.server_revision.c_str()); + ngi.version_compatible = IsNetworkCompatibleVersion(ngi.server_revision); ngi.compatible = ngi.version_compatible; /* Check if we have all the GRFs on the client-system too. */ diff --git a/src/network/core/game_info.h b/src/network/core/game_info.h --- a/src/network/core/game_info.h +++ b/src/network/core/game_info.h @@ -89,8 +89,8 @@ struct NetworkGameInfo : NetworkServerGa extern NetworkServerGameInfo _network_game_info; -const char *GetNetworkRevisionString(); -bool IsNetworkCompatibleVersion(const char *other); +std::string_view GetNetworkRevisionString(); +bool IsNetworkCompatibleVersion(std::string_view other); void CheckGameCompatibility(NetworkGameInfo &ngi); void FillStaticNetworkServerGameInfo(); diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -878,7 +878,7 @@ NetworkRecvStatus ServerNetworkGameSocke uint32 newgrf_version = p->Recv_uint32(); /* Check if the client has revision control enabled */ - if (!IsNetworkCompatibleVersion(client_revision.c_str()) || _openttd_newgrf_version != newgrf_version) { + if (!IsNetworkCompatibleVersion(client_revision) || _openttd_newgrf_version != newgrf_version) { /* Different revisions!! */ return this->SendError(NETWORK_ERROR_WRONG_REVISION); }