wow: Reverse string bytes before converting to UTF-8

WOW has several 4 octet ASCII strings in reverse order. g_strreverse
does not work on UTF-8 multibyte characters, such as REPLACEMENT
CHARACTER when there are errors. Reverse the string buffer before
converting from ASCII.

Fix #18529
This commit is contained in:
John Thacker 2022-10-22 09:34:23 -04:00
parent be992b94a1
commit 398fb66598
1 changed files with 10 additions and 5 deletions

View File

@ -17,6 +17,7 @@
#include <epan/packet.h>
#include <epan/prefs.h>
#include <epan/charsets.h>
#include "packet-tcp.h"
void proto_register_wow(void);
@ -457,6 +458,7 @@ parse_logon_reconnect_challenge_server_to_client(tvbuff_t *tvb, proto_tree *wow_
static void
parse_logon_challenge_client_to_server(packet_info *pinfo, tvbuff_t *tvb, proto_tree *wow_tree, guint32 offset) {
guint8 srp_i_len;
char buffer[5];
gchar *string;
proto_tree_add_item(wow_tree, hf_wow_protocol_version, tvb,
@ -467,13 +469,13 @@ parse_logon_challenge_client_to_server(packet_info *pinfo, tvbuff_t *tvb, proto_
tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
string = g_strreverse(tvb_get_string_enc(pinfo->pool, tvb, offset, 4, ENC_ASCII));
tvb_get_raw_bytes_as_string(tvb, offset, buffer, 5);
string = get_ascii_string(pinfo->pool, g_strreverse(buffer), 4);
proto_tree_add_string(wow_tree, hf_wow_gamename,
tvb, offset, 4, string);
offset += 4;
client_game_version.major_version = tvb_get_guint8(tvb, offset);
proto_tree_add_item(wow_tree, hf_wow_version1,
tvb, offset, 1, ENC_LITTLE_ENDIAN);
@ -494,17 +496,20 @@ parse_logon_challenge_client_to_server(packet_info *pinfo, tvbuff_t *tvb, proto_
offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
string = g_strreverse(tvb_get_string_enc(pinfo->pool, tvb, offset, 4, ENC_ASCII));
tvb_get_raw_bytes_as_string(tvb, offset, buffer, 5);
string = get_ascii_string(pinfo->pool, g_strreverse(buffer), 4);
proto_tree_add_string(wow_tree, hf_wow_platform,
tvb, offset, 4, string);
offset += 4;
string = g_strreverse(tvb_get_string_enc(pinfo->pool, tvb, offset, 4, ENC_ASCII));
tvb_get_raw_bytes_as_string(tvb, offset, buffer, 5);
string = get_ascii_string(pinfo->pool, g_strreverse(buffer), 4);
proto_tree_add_string(wow_tree, hf_wow_os, tvb,
offset, 4, string);
offset += 4;
string = g_strreverse(tvb_get_string_enc(pinfo->pool, tvb, offset, 4, ENC_ASCII));
tvb_get_raw_bytes_as_string(tvb, offset, buffer, 5);
string = get_ascii_string(pinfo->pool, g_strreverse(buffer), 4);
proto_tree_add_string(wow_tree, hf_wow_country,
tvb, offset, 4, string);
offset += 4;