From 13de67b6f8332dfa34817d51df221c7148b44b4f Mon Sep 17 00:00:00 2001 From: Anon Date: Wed, 21 Feb 2024 17:38:32 +0100 Subject: [PATCH] Fixed a crash on chat parsing. Returned the commended try catch block. --- .../Protocol/Handlers/Protocol18.cs | 98 ++++++++++--------- .../Protocol/Message/ChatParser.cs | 5 +- 2 files changed, 55 insertions(+), 48 deletions(-) diff --git a/MinecraftClient/Protocol/Handlers/Protocol18.cs b/MinecraftClient/Protocol/Handlers/Protocol18.cs index 8a3b53d2b6..0f9e8e6f04 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol18.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol18.cs @@ -365,8 +365,8 @@ internal Tuple> ReadNextPacket() /// TRUE if the packet was processed, FALSE if ignored or unknown internal bool HandlePacket(int packetId, Queue packetData) { - //try - //{ + try + { switch (currentState) { // https://wiki.vg/Protocol#Login @@ -403,16 +403,16 @@ internal bool HandlePacket(int packetId, Queue packetData) handler.OnConnectionLost(ChatBot.DisconnectReason.InGameKick, dataTypes.ReadNextChat(packetData)); return false; - + case ConfigurationPacketTypesIn.FinishConfiguration: currentState = CurrentState.Play; SendPacket(ConfigurationPacketTypesOut.FinishConfiguration, new List()); break; - + case ConfigurationPacketTypesIn.KeepAlive: SendPacket(ConfigurationPacketTypesOut.KeepAlive, packetData); break; - + case ConfigurationPacketTypesIn.Ping: SendPacket(ConfigurationPacketTypesOut.Pong, packetData); break; @@ -425,12 +425,12 @@ internal bool HandlePacket(int packetId, Queue packetData) World.StoreDimensionList(registryCodec); break; - + case ConfigurationPacketTypesIn.RemoveResourcePack: if (dataTypes.ReadNextBool(packetData)) // Has UUID dataTypes.ReadNextUUID(packetData); // UUID break; - + case ConfigurationPacketTypesIn.ResourcePack: HandleResourcePackPacket(packetData); break; @@ -449,23 +449,23 @@ internal bool HandlePacket(int packetId, Queue packetData) default: return true; } - //} - //catch (Exception innerException) - //{ - // //throw; - // if (innerException is ThreadAbortException || innerException is SocketException || - // innerException.InnerException is SocketException) - // throw; //Thread abort or Connection lost rather than invalid data - - // throw new System.IO.InvalidDataException( - // string.Format(Translations.exception_packet_process, - // packetPalette.GetIncomingTypeById(packetId), - // packetId, - // protocolVersion, - // currentState == CurrentState.Login, - // innerException.GetType()), - // innerException); - //} + } + catch (Exception innerException) + { + //throw; + if (innerException is ThreadAbortException || innerException is SocketException || + innerException.InnerException is SocketException) + throw; //Thread abort or Connection lost rather than invalid data + + throw new System.IO.InvalidDataException( + string.Format(Translations.exception_packet_process, + packetPalette.GetIncomingTypeById(packetId), + packetId, + protocolVersion, + currentState == CurrentState.Login, + innerException.GetType()), + innerException); + } return true; } @@ -473,10 +473,10 @@ internal bool HandlePacket(int packetId, Queue packetData) public void HandleResourcePackPacket(Queue packetData) { var uuid = Guid.Empty; - + if (protocolVersion >= MC_1_20_4_Version) uuid = dataTypes.ReadNextUUID(packetData); - + var url = dataTypes.ReadNextString(packetData); var hash = dataTypes.ReadNextString(packetData); @@ -493,21 +493,23 @@ public void HandleResourcePackPacket(Queue packetData) return; //Send back "accepted" and "successfully loaded" responses for plugins or server config making use of resource pack mandatory - var responseHeader = protocolVersion < MC_1_10_Version // After 1.10, the MC does not include resource pack hash in responses - ? dataTypes.ConcatBytes(DataTypes.GetVarInt(hash.Length), Encoding.UTF8.GetBytes(hash)) - : Array.Empty(); - + var responseHeader = + protocolVersion < MC_1_10_Version // After 1.10, the MC does not include resource pack hash in responses + ? dataTypes.ConcatBytes(DataTypes.GetVarInt(hash.Length), Encoding.UTF8.GetBytes(hash)) + : Array.Empty(); + var basePacketData = protocolVersion >= MC_1_20_4_Version && uuid != Guid.Empty ? dataTypes.ConcatBytes(responseHeader, DataTypes.GetUUID(uuid)) : responseHeader; var acceptedResourcePackData = dataTypes.ConcatBytes(basePacketData, DataTypes.GetVarInt(3)); var loadedResourcePackData = dataTypes.ConcatBytes(basePacketData, DataTypes.GetVarInt(0)); - + if (currentState == CurrentState.Configuration) { SendPacket(ConfigurationPacketTypesOut.ResourcePackResponse, acceptedResourcePackData); // Accepted - SendPacket(ConfigurationPacketTypesOut.ResourcePackResponse, loadedResourcePackData); // Successfully loaded + SendPacket(ConfigurationPacketTypesOut.ResourcePackResponse, + loadedResourcePackData); // Successfully loaded } else { @@ -515,7 +517,7 @@ public void HandleResourcePackPacket(Queue packetData) SendPacket(PacketTypesOut.ResourcePackStatus, loadedResourcePackData); // Successfully loaded } } - + private bool HandlePlayPackets(int packetId, Queue packetData) { switch (packetPalette.GetIncomingTypeById(packetId)) @@ -1677,7 +1679,7 @@ private bool HandlePlayPackets(int packetId, Queue packetData) var hasIcon = dataTypes.ReadNextBool(packetData); if (hasIcon) { - if(protocolVersion < MC_1_20_2_Version) + if (protocolVersion < MC_1_20_2_Version) iconBase64 = dataTypes.ReadNextString(packetData); else { @@ -2164,9 +2166,9 @@ private bool HandlePlayPackets(int packetId, Queue packetData) break; case PacketTypesIn.ResetScore: dataTypes.ReadNextString(packetData); // Entity Name - if(dataTypes.ReadNextBool(packetData)) // Has Objective Name + if (dataTypes.ReadNextBool(packetData)) // Has Objective Name dataTypes.ReadNextString(packetData); // Objective Name - + break; case PacketTypesIn.SpawnEntity: if (handler.GetEntityHandlingEnabled()) @@ -2517,7 +2519,7 @@ private bool HandlePlayPackets(int packetId, Queue packetData) dataTypes.ReadNextVarInt(packetData); // Block Interaction dataTypes.ReadParticleData(packetData, itemPalette); // Small Explosion Particles dataTypes.ReadParticleData(packetData, itemPalette); // Large Explosion Particles - + // Explosion Sound dataTypes.ReadNextString(packetData); // Sound Name var hasFixedRange = dataTypes.ReadNextBool(packetData); @@ -2533,11 +2535,11 @@ private bool HandlePlayPackets(int packetId, Queue packetData) case PacketTypesIn.ScoreboardObjective: var objectiveName = dataTypes.ReadNextString(packetData); var mode = dataTypes.ReadNextByte(packetData); - + var objectiveValue = string.Empty; var objectiveType = -1; var numberFormat = 0; - + if (mode is 0 or 2) { objectiveValue = dataTypes.ReadNextChat(packetData); @@ -2560,15 +2562,16 @@ private bool HandlePlayPackets(int packetId, Queue packetData) var objectiveValue2 = -1; var objectiveDisplayName3 = string.Empty; var numberFormat2 = 0; - + if (protocolVersion >= MC_1_20_4_Version) { objectiveName3 = dataTypes.ReadNextString(packetData); // Objective Name objectiveValue2 = dataTypes.ReadNextVarInt(packetData); // Value if (dataTypes.ReadNextBool(packetData)) // Has Display Name - objectiveDisplayName3 = ChatParser.ParseText(dataTypes.ReadNextString(packetData)); // Has Display Name - + objectiveDisplayName3 = + ChatParser.ParseText(dataTypes.ReadNextString(packetData)); // Has Display Name + if (dataTypes.ReadNextBool(packetData)) // Has Number Format numberFormat2 = dataTypes.ReadNextVarInt(packetData); // Number Format } @@ -2580,12 +2583,13 @@ private bool HandlePlayPackets(int packetId, Queue packetData) if (action3 != 1 || protocolVersion >= MC_1_8_Version) objectiveName3 = dataTypes.ReadNextString(packetData); - + if (action3 != 1) objectiveValue2 = dataTypes.ReadNextVarInt(packetData); } - handler.OnUpdateScore(entityName, action3, objectiveName3, objectiveDisplayName3, objectiveValue2, numberFormat2); + handler.OnUpdateScore(entityName, action3, objectiveName3, objectiveDisplayName3, objectiveValue2, + numberFormat2); break; case PacketTypesIn.BlockChangedAck: handler.OnBlockChangeAck(dataTypes.ReadNextVarInt(packetData)); @@ -2635,7 +2639,7 @@ private bool HandlePlayPackets(int packetId, Queue packetData) dataTypes.ReadNextFloat(packetData); dataTypes.ReadNextBool(packetData); break; - + default: return false; //Ignored packet } @@ -2704,7 +2708,7 @@ private void SendPacket(PacketTypesOut packet, IEnumerable packetData) { SendPacket(packetPalette.GetOutgoingIdByType(packet), packetData); } - + /// /// Send a configuration packet to the server. Packet ID, compression, and encryption will be handled automatically. /// @@ -4493,7 +4497,7 @@ public bool SendPlayerSession(PlayerKeyPair? playerKeyPair) return false; } } - + return false; } diff --git a/MinecraftClient/Protocol/Message/ChatParser.cs b/MinecraftClient/Protocol/Message/ChatParser.cs index 7be5dbeeda..3e47d72600 100644 --- a/MinecraftClient/Protocol/Message/ChatParser.cs +++ b/MinecraftClient/Protocol/Message/ChatParser.cs @@ -471,7 +471,10 @@ private static string NbtToString(Dictionary nbt) var withs = (object[])withComponent; for (int i = 0; i < withs.Length; i++) { - var withDict = (Dictionary)withs[i]; + var withDict = withs[i] is string + ? new Dictionary() { { "text", (string)withs[i] } } + : (Dictionary)withs[i]; + translateString.Add(NbtToString(withDict)); } }