diff options
author | Dario Lombardo <lomato@gmail.com> | 2016-10-11 13:58:27 +0200 |
---|---|---|
committer | Dario Lombardo <lomato@gmail.com> | 2016-10-17 09:22:55 +0000 |
commit | 913225b5d4f334ec0298748cbcad6924cf57bcc3 (patch) | |
tree | 0e9ac38bc6bf109775a69377d0d096aef5d0b380 /epan | |
parent | 5546400b55c4524e86ce98a92444fd3b48dcc96c (diff) |
quakeworld: use ws_strtou function.
Change-Id: I2d4d97229ee4fee37b26a2dabab9d373a0401e13
Reviewed-on: https://code.wireshark.org/review/18149
Petri-Dish: Dario Lombardo <lomato@gmail.com>
Reviewed-by: Peter Wu <peter@lekensteyn.nl>
Reviewed-by: Dario Lombardo <lomato@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-quakeworld.c | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/epan/dissectors/packet-quakeworld.c b/epan/dissectors/packet-quakeworld.c index e3616e34b8..5ef19c8cbd 100644 --- a/epan/dissectors/packet-quakeworld.c +++ b/epan/dissectors/packet-quakeworld.c @@ -31,6 +31,9 @@ #include <epan/packet.h> #include <epan/prefs.h> #include <epan/prefs-int.h> +#include <epan/expert.h> + +#include <wsutil/strtoi.h> void proto_register_quakeworld(void); void proto_reg_handoff_quakeworld(void); @@ -72,6 +75,8 @@ static gint ett_quakeworld_game_seq2 = -1; static gint ett_quakeworld_game_clc = -1; static gint ett_quakeworld_game_svc = -1; +static expert_field ei_quakeworld_connectionless_command_invalid = EI_INIT; + /* helper functions, they may ave to go somewhere else they are mostly copied without change from @@ -345,6 +350,7 @@ dissect_quakeworld_ConnectionlessPacket(tvbuff_t *tvb, packet_info *pinfo, { proto_tree *cl_tree; proto_tree *text_tree = NULL; + proto_item *pi; guint8 *text; int len; int offset; @@ -390,16 +396,19 @@ dissect_quakeworld_ConnectionlessPacket(tvbuff_t *tvb, packet_info *pinfo, command = "Log"; command_len = 3; } else if (strcmp(c,"connect") == 0) { - int version; - int qport; - int challenge; + guint32 version = 0; + guint16 qport = 0; + guint32 challenge = 0; + gboolean version_valid = TRUE; + gboolean qport_valid = TRUE; + gboolean challenge_valid = TRUE; const char *infostring; proto_tree *argument_tree = NULL; command = "Connect"; command_len = Cmd_Argv_length(0); if (text_tree) { proto_item *argument_item; - proto_tree_add_string(text_tree, hf_quakeworld_connectionless_command, + pi = proto_tree_add_string(text_tree, hf_quakeworld_connectionless_command, tvb, offset, command_len, command); argument_item = proto_tree_add_string(text_tree, hf_quakeworld_connectionless_arguments, @@ -409,10 +418,14 @@ dissect_quakeworld_ConnectionlessPacket(tvbuff_t *tvb, packet_info *pinfo, ett_quakeworld_connectionless_arguments); command_finished=TRUE; } - version = atoi(Cmd_Argv(1)); - qport = atoi(Cmd_Argv(2)); - challenge = atoi(Cmd_Argv(3)); + version_valid = ws_strtou32(Cmd_Argv(1), NULL, &version); + qport_valid = ws_strtou16(Cmd_Argv(2), NULL, &qport); + challenge_valid = ws_strtou32(Cmd_Argv(3), NULL, &challenge); infostring = Cmd_Argv(4); + + if (text_tree && (!version_valid || !qport_valid || !challenge_valid)) + expert_add_info(pinfo, pi, &ei_quakeworld_connectionless_command_invalid); + if (argument_tree) { proto_item *info_item; proto_tree *info_tree; @@ -518,7 +531,7 @@ dissect_quakeworld_ConnectionlessPacket(tvbuff_t *tvb, packet_info *pinfo, } else if (text[0] == S2C_CHALLENGE) { command = "Challenge"; command_len = 1; - /* string, atoi */ + /* string, conversion */ } else { command = "Unknown"; command_len = len - 1; @@ -699,6 +712,8 @@ apply_quakeworld_prefs(void) void proto_register_quakeworld(void) { + expert_module_t* expert_quakeworld; + static hf_register_info hf[] = { { &hf_quakeworld_c2s, { "Client to Server", "quakeworld.c2s", @@ -803,12 +818,20 @@ proto_register_quakeworld(void) &ett_quakeworld_game_svc }; + static ei_register_info ei[] = { + { &ei_quakeworld_connectionless_command_invalid, { "quakeworld.connectionless.command.invalid", + PI_MALFORMED, PI_ERROR, "Invalid connectionless command", EXPFILL }} + }; + proto_quakeworld = proto_register_protocol("QuakeWorld Network Protocol", "QUAKEWORLD", "quakeworld"); proto_register_field_array(proto_quakeworld, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); /* Register a configuration option for port */ prefs_register_protocol(proto_quakeworld, apply_quakeworld_prefs); + + expert_quakeworld = expert_register_protocol(proto_quakeworld); + expert_register_field_array(expert_quakeworld, ei, array_length(ei)); } |