Ethereal-dev: [ethereal-dev] Patches for dissect-ftp etc
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Richard Sharpe <sharpe@xxxxxxxxxx>
Date: Fri, 02 Apr 1999 20:46:11 +0900
Hi, I seem to have debugged dissect-ftp, and have added a dissect-ftpdata, and tried to clean up pop along the way ... Here it is ...
--- packet-ftp.c.orig Fri Apr 2 19:25:53 1999
+++ packet-ftp.c Sat Apr 3 05:26:10 1999
@@ -48,7 +48,7 @@
extern packet_info pi;
void
-dissect_ftp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
+dissect_ftp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int max_data)
{
proto_tree *ftp_tree, *ti;
gchar rr[50], rd[1500];
@@ -58,9 +58,29 @@
bzero(rr, sizeof(rr));
bzero(rd, sizeof(rd));
- strncpy(rr, pd + offset, MIN(i1, sizeof(rr) - 1));
- i2 = (int)index(pd + offset + i1 + 1, '\r') - (int)pd - offset - i1 - 1;
- strncpy(rd, pd + offset + i1 + 1, MIN(i2, sizeof(rd) - 1));
+ if (i1 > 0) {
+
+ /* Hmmm, check if there was no space in there ... */
+
+ if (i1 > max_data) {
+
+ i1 = max_data; /* Make things below work */
+ strncpy(rr, pd + offset, MIN(max_data - 2, sizeof(rr) - 1));
+
+ }
+ else {
+
+ strncpy(rr, pd + offset, MIN(i1, sizeof(rr) - 1));
+ i2 = (int)index(pd + offset + i1 + 1, '\r') - (int)pd - offset - i1 - 1;
+ strncpy(rd, pd + offset + i1 + 1, MIN(i2, sizeof(rd) - 1));
+ }
+ }
+ else {
+
+ i1 = max_data;
+ strncpy(rr, pd + offset, MIN(max_data - 2, sizeof(rr) - 1)); /* Lazy, CRLF */
+
+ }
if (check_col(fd, COL_PROTOCOL))
col_add_str(fd, COL_PROTOCOL, "FTP");
@@ -76,7 +96,7 @@
ti = proto_tree_add_item(tree, offset, END_OF_FRAME,
"File Transfer Protocol");
ftp_tree = proto_tree_new();
- proto_item_add_subtree(ti, ftp_tree, ETT_POP);
+ proto_item_add_subtree(ti, ftp_tree, ETT_FTP);
if (pi.match_port == pi.destport) { /* Request */
@@ -91,6 +111,28 @@
proto_tree_add_item(ftp_tree, offset + i1 + 1, END_OF_FRAME, "Response Arg: %s", rd);
}
+
+ }
+}
+
+void
+dissect_ftpdata(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int max_data)
+{
+ proto_tree *ftp_tree, *ti;
+
+ if (check_col(fd, COL_PROTOCOL))
+ col_add_str(fd, COL_PROTOCOL, "FTP DATA");
+
+ if (check_col(fd, COL_INFO)) {
+
+ col_add_fstr(fd, COL_INFO, "FTP Data ...");
+
+ }
+
+ if (tree) {
+
+ ti = proto_tree_add_item(tree, offset, END_OF_FRAME,
+ "File Transfer Protocol Data");
}
}
--- packet-ip.c.orig Fri Apr 2 08:37:11 1999
+++ packet-ip.c Fri Apr 2 08:00:50 1999
@@ -699,6 +699,7 @@
pi.iplen = iph.ip_len;
pi.iphdrlen = lo_nibble(iph.ip_v_hl);
pi.ip_src = iph.ip_src;
+ pi.payload = pi.iplen - hlen;
offset += hlen;
switch (iph.ip_p) {
--- packet-pop.c.orig Fri Apr 2 08:39:07 1999
+++ packet-pop.c Sat Apr 3 05:11:08 1999
@@ -48,7 +48,7 @@
extern packet_info pi;
void
-dissect_pop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
+dissect_pop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int max_data)
{
proto_tree *pop_tree, *ti;
gchar rr[50], rd[1500];
@@ -58,9 +58,18 @@
bzero(rr, sizeof(rr));
bzero(rd, sizeof(rd));
- strncpy(rr, pd + offset, MIN(i1, sizeof(rr) - 1));
- i2 = (int)index(pd + offset + i1 + 1, '\r') - (int)pd - offset - i1 - 1;
- strncpy(rd, pd + offset + i1 + 1, MIN(i2, sizeof(rd) - 1));
+ if ((i1 > max_data) || (i1 <= 0)) {
+
+ i1 = max_data;
+ strncpy(rr, pd + offset, MIN(max_data - 2, sizeof(rr) - 1));
+
+ }
+ else {
+
+ strncpy(rr, pd + offset, MIN(i1, sizeof(rr) - 1));
+ i2 = (int)index(pd + offset + i1 + 1, '\r') - (int)pd - offset - i1 - 1;
+ strncpy(rd, pd + offset + i1 + 1, MIN(i2, sizeof(rd) - 1));
+ }
if (check_col(fd, COL_PROTOCOL))
col_add_str(fd, COL_PROTOCOL, "POP");
--- packet-tcp.c.orig Fri Apr 2 08:36:47 1999
+++ packet-tcp.c Sat Apr 3 05:22:08 1999
@@ -324,6 +324,8 @@
guint bpos;
guint hlen;
guint optlen;
+ guint packet_max = pi.payload + offset;
+ guint payload;
/* To do: Check for {cap len,pkt len} < struct len */
/* Avoids alignment problems on many architectures. */
@@ -355,6 +357,8 @@
hlen = hi_nibble(th.th_off_x2) * 4; /* TCP header length, in bytes */
+ payload = pi.payload - hlen;
+
if (check_col(fd, COL_RES_SRC_PORT))
col_add_str(fd, COL_RES_SRC_PORT, get_tcp_port(th.th_sport));
if (check_col(fd, COL_UNRES_SRC_PORT))
@@ -448,20 +452,25 @@
/* Check the packet length to see if there's more data
(it could be an ACK-only packet) */
- if (pd->cap_len > offset) {
+ if (packet_max > offset) {
switch(MIN(th.th_sport, th.th_dport)) {
case TCP_PORT_PRINTER:
dissect_lpd(pd, offset, fd, tree);
break;
+ case TCP_PORT_FTPDATA:
+ pi.match_port = TCP_PORT_FTPDATA;
+ dissect_ftpdata(pd, offset, fd, tree, payload);
+ break;
+
case TCP_PORT_FTP:
- pi.match_port = TCP_PORT_POP;
- dissect_ftp(pd, offset, fd, tree);
+ pi.match_port = TCP_PORT_FTP;
+ dissect_ftp(pd, offset, fd, tree, payload);
break;
case TCP_PORT_POP:
pi.match_port = TCP_PORT_POP;
- dissect_pop(pd, offset, fd, tree);
+ dissect_pop(pd, offset, fd, tree, payload);
break;
case TCP_PORT_HTTP:
Regards ------- Richard Sharpe, sharpe@xxxxxxxxxx, NIC-Handle:RJS96 NS Computer Software and Services P/L, Ph: +61-8-8281-0063, FAX: +61-8-8250-2080, Samba (Team member), Linux, Apache, Digital UNIX, AIX, C, ...
- Prev by Date: [ethereal-dev] command-line argument 'k'
- Next by Date: [ethereal-dev] Ooops, more stuff for the latest updates ...
- Previous by thread: [ethereal-dev] command-line argument 'k'
- Next by thread: [ethereal-dev] Ooops, more stuff for the latest updates ...
- Index(es):





