aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-rlogin.c
diff options
context:
space:
mode:
authorDario Lombardo <lomato@gmail.com>2016-09-21 16:53:11 +0200
committerMichael Mann <mmann78@netscape.net>2016-10-01 12:34:09 +0000
commitb6ad91520fd602710f5afe4a4eb8787a6bca22d4 (patch)
tree4651c7ef03d0f97cf3dcf0adad65b01bb5303585 /epan/dissectors/packet-rlogin.c
parent7ea363223a5a5a872d66a65570c134c34aa51b49 (diff)
rlogin: use ws_strtou function.
Add expert info when conversion fails. Change-Id: Ic13cb90abddd08218a957cd771bd5a4fab5a413e Reviewed-on: https://code.wireshark.org/review/17839 Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/dissectors/packet-rlogin.c')
-rw-r--r--epan/dissectors/packet-rlogin.c31
1 files changed, 28 insertions, 3 deletions
diff --git a/epan/dissectors/packet-rlogin.c b/epan/dissectors/packet-rlogin.c
index e2c6e0a8ae..a7e92d364c 100644
--- a/epan/dissectors/packet-rlogin.c
+++ b/epan/dissectors/packet-rlogin.c
@@ -27,6 +27,8 @@
#include <stdlib.h>
#include <epan/packet.h>
+#include <epan/expert.h>
+#include <wsutil/strtoi.h>
#include "packet-tcp.h"
#define RLOGIN_PORT 513
@@ -61,6 +63,8 @@ static int hf_window_info_x_pixels = -1;
static int hf_window_info_y_pixels = -1;
static int hf_data = -1;
+static expert_field ei_rlogin_termlen_invalid = EI_INIT;
+
static const value_string control_message_vals[] =
{
{ 0x02, "Clear buffer" },
@@ -284,6 +288,11 @@ static void rlogin_display(rlogin_hash_entry_t *hash_info,
slash_offset = tvb_find_guint8(tvb, offset, -1, '/');
if (slash_offset != -1)
{
+ guint8* str = NULL;
+ guint32 term_len = 0;
+ gboolean term_len_valid;
+ proto_item* pi = NULL;
+
/* Terminal type */
proto_tree_add_item(user_info_tree, hf_user_info_terminal_type,
tvb, offset, slash_offset-offset, ENC_ASCII|ENC_NA);
@@ -291,9 +300,15 @@ static void rlogin_display(rlogin_hash_entry_t *hash_info,
/* Terminal speed */
str_len = tvb_strsize(tvb, offset);
- proto_tree_add_uint(user_info_tree, hf_user_info_terminal_speed,
- tvb, offset, str_len,
- atoi(tvb_format_text(tvb, offset, str_len)));
+ str = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, str_len,
+ ENC_NA|ENC_ASCII);
+ term_len_valid = ws_strtou32(str, NULL, &term_len);
+ pi = proto_tree_add_uint(user_info_tree,
+ hf_user_info_terminal_speed,
+ tvb, offset, str_len, term_len);
+ if (!term_len_valid)
+ expert_add_info(pinfo, pi, &ei_rlogin_termlen_invalid);
+
offset += str_len;
}
}
@@ -474,6 +489,8 @@ dissect_rlogin(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
void proto_register_rlogin(void)
{
+ expert_module_t* expert_rlogin;
+
static gint *ett[] = {
&ett_rlogin,
&ett_rlogin_window,
@@ -568,10 +585,18 @@ void proto_register_rlogin(void)
}
};
+ static ei_register_info ei[] = {
+ { &ei_rlogin_termlen_invalid, { "rlogin.terminal_speed.invalid", PI_MALFORMED, PI_ERROR,
+ "Terminal length must be a string containing an integer", EXPFILL }}
+ };
+
proto_rlogin = proto_register_protocol("Rlogin Protocol", "Rlogin", "rlogin");
proto_register_field_array(proto_rlogin, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
+
+ expert_rlogin = expert_register_protocol(proto_rlogin);
+ expert_register_field_array(expert_rlogin, ei, array_length(ei));
}
void proto_reg_handoff_rlogin(void)