Ethereal-dev: [ethereal-dev] Padding patch for packet-smb.c
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Mark Burton <markb@xxxxxxxxxx>
Date: Fri, 19 May 2000 20:32:45 +0100
Hi,
I have been using the marvellous ethereal to dissect some naughty SMB
packets and believe that ethereal's treatment of the pad1 & pad2
fields in some SMBs is incorrect. In particular, the original code
assumes that some data needs aligning on a 2 byte boundary but it may
be aligned on a 4 byte boundary (according to the CIFS/1.0 spec I
have).
The enclosed patch should improve matters.
I may well add some more dissecting code. If I do, I shall continue to
post patches to ethereal-dev unless otherwise advised.
Regards,
Mark
Index: packet-smb.c
===================================================================
RCS file: /cvsroot/ethereal/packet-smb.c,v
retrieving revision 1.65
diff -c -r1.65 packet-smb.c
*** packet-smb.c 2000/05/11 08:15:46 1.65
--- packet-smb.c 2000/05/19 18:30:16
***************
*** 8233,8240 ****
guint8 SetupCount;
guint8 Reserved3;
guint8 Reserved1;
- guint8 Pad2;
- guint8 Pad1;
guint8 MaxSetupCount;
guint8 Data;
guint32 Timeout;
--- 8233,8238 ----
***************
*** 8561,8580 ****
}
! if (offset % 2) {
! /* Build display for: Pad1 */
! Pad1 = GBYTE(pd, offset);
if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 1, "Pad1: %u", Pad1);
!
}
-
- offset += 1; /* Skip Pad1 */
}
if (ParameterCount > 0) {
--- 8559,8577 ----
}
! if (offset < (SMB_offset + ParameterOffset)) {
! int pad1Count = SMB_offset + ParameterOffset - offset;
! /* Build display for: Pad1 */
if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, pad1Count, "Pad1: %s", format_text(pd + offset, pad1Count));
}
+ offset += pad1Count; /* Skip Pad1 */
+
}
if (ParameterCount > 0) {
***************
*** 8590,8609 ****
offset += ParameterCount; /* Skip Parameters */
}
! if (offset % 2) {
/* Build display for: Pad2 */
- Pad2 = GBYTE(pd, offset);
-
if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 1, "Pad2: %u", Pad2);
}
! offset += 1; /* Skip Pad2 */
}
--- 8587,8606 ----
offset += ParameterCount; /* Skip Parameters */
}
+
+ if (DataCount > 0 && offset < (SMB_offset + DataOffset)) {
! int pad2Count = SMB_offset + DataOffset - offset;
/* Build display for: Pad2 */
if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, pad2Count, "Pad2: %s", format_text(pd + offset, pad2Count));
}
! offset += pad2Count; /* Skip Pad2 */
}
***************
*** 8778,8794 ****
offset += 1; /* Skip Reserved3 */
! /* Build display for: Setup */
! Setup = GSHORT(pd, offset);
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 2, "Setup: %u", Setup);
! }
! offset += 2; /* Skip Setup */
/* Build display for: Byte Count (BCC) */
--- 8775,8800 ----
offset += 1; /* Skip Reserved3 */
! if (SetupCount > 0) {
! int i = SetupCount;
! Setup = GSHORT(pd, offset);
! for (i = 1; i <= SetupCount; i++) {
!
! Setup = GSHORT(pd, offset);
! if (tree) {
!
! proto_tree_add_text(tree, NullTVB, offset, 2, "Setup%i: %u", i, Setup);
!
! }
!
! offset += 2; /* Skip Setup */
! }
! }
/* Build display for: Byte Count (BCC) */
***************
*** 8802,8818 ****
offset += 2; /* Skip Byte Count (BCC) */
! /* Build display for: Pad1 */
! Pad1 = GBYTE(pd, offset);
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 1, "Pad1: %u", Pad1);
! }
! offset += 1; /* Skip Pad1 */
/* Build display for: Parameter */
--- 8808,8827 ----
offset += 2; /* Skip Byte Count (BCC) */
! if (offset < (SMB_offset + ParameterOffset)) {
! int pad1Count = SMB_offset + ParameterOffset - offset;
! /* Build display for: Pad1 */
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, pad1Count, "Pad1: %s", format_text(pd + offset, pad1Count));
! }
!
! offset += pad1Count; /* Skip Pad1 */
! }
/* Build display for: Parameter */
***************
*** 8828,8844 ****
}
! /* Build display for: Pad2 */
! Pad2 = GBYTE(pd, offset);
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 1, "Pad2: %u", Pad2);
! }
! offset += 1; /* Skip Pad2 */
/* Build display for: Data */
--- 8837,8857 ----
}
! if (DataCount > 0 && offset < (SMB_offset + DataOffset)) {
! int pad2Count = SMB_offset + DataOffset - offset;
!
! /* Build display for: Pad2 */
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, pad2Count, "Pad2: %s", format_text(pd + offset, pad2Count));
! }
!
! offset += pad2Count; /* Skip Pad2 */
! }
/* Build display for: Data */
***************
*** 8865,8871 ****
char *TransactNameCopy;
char *trans_type = NULL, *trans_cmd, *loc_of_slash = NULL;
int index;
- guint8 Pad2;
const gchar *Data;
if (!TransactName)
--- 8878,8883 ----
***************
*** 8908,8927 ****
offset = SMB_offset + ParameterOffset + ParameterCount; /* Skip Parameters */
}
! if (offset % 2) {
/* Build display for: Pad2 */
- Pad2 = GBYTE(pd, offset);
-
if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 1, "Pad2: %u: %u", Pad2, offset);
}
! offset += 1; /* Skip Pad2 */
}
--- 8920,8939 ----
offset = SMB_offset + ParameterOffset + ParameterCount; /* Skip Parameters */
}
+
+ if (DataCount > 0 && offset < (SMB_offset + DataOffset)) {
! int pad2Count = SMB_offset + DataOffset - offset;
/* Build display for: Pad2 */
if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, pad2Count, "Pad2: %s", format_text(pd + offset, pad2Count));
}
! offset += pad2Count; /* Skip Pad2 */
}
***************
*** 8954,8960 ****
guint8 SetupCount;
guint8 Reserved3;
guint8 Reserved1;
- guint8 Pad1;
guint8 MaxSetupCount;
guint32 Timeout;
guint16 TotalParameterCount;
--- 8966,8971 ----
***************
*** 9297,9315 ****
offset += TNlen; /* Skip Transact Name */
if (si.unicode) offset += 2; /* There are two more extraneous bytes there*/
! if (offset % 2) {
! /* Build display for: Pad1 */
! Pad1 = GBYTE(pd, offset);
if (tree) {
-
- proto_tree_add_text(tree, NullTVB, offset, 1, "Pad1: %u", Pad1);
}
!
! offset += 1; /* Skip Pad1 */
}
--- 9308,9325 ----
offset += TNlen; /* Skip Transact Name */
if (si.unicode) offset += 2; /* There are two more extraneous bytes there*/
! if (offset < (SMB_offset + ParameterOffset)) {
! int pad1Count = SMB_offset + ParameterOffset - offset;
! /* Build display for: Pad1 */
if (tree) {
+ proto_tree_add_text(tree, NullTVB, offset, pad1Count, "Pad1: %s", format_text(pd + offset, pad1Count));
}
!
! offset += pad1Count; /* Skip Pad1 */
}
***************
*** 9480,9496 ****
if (SetupCount > 0) {
! /* Hmmm, should code for all setup words ... */
Setup = GSHORT(pd, offset);
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 2, "Setup: %u", Setup);
! }
! offset += 2; /* Skip Setup */
}
--- 9490,9512 ----
if (SetupCount > 0) {
! int i = SetupCount;
Setup = GSHORT(pd, offset);
! for (i = 1; i <= SetupCount; i++) {
!
! Setup = GSHORT(pd, offset);
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 2, "Setup%i: %u", i, Setup);
! }
!
! offset += 2; /* Skip Setup */
!
! }
}
***************
*** 9508,9524 ****
/* Build display for: Pad1 */
! if (offset % 2) {
! Pad1 = GBYTE(pd, offset);
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 1, "Pad1: %u", Pad1);
}
! offset += 1; /* Skip Pad1 */
}
--- 9524,9541 ----
/* Build display for: Pad1 */
! if (offset < (SMB_offset + ParameterOffset)) {
! int pad1Count = SMB_offset + ParameterOffset - offset;
! /* Build display for: Pad1 */
! if (tree) {
+ proto_tree_add_text(tree, NullTVB, offset, pad1Count, "Pad1: %s", format_text(pd + offset, pad1Count));
}
! offset += pad1Count; /* Skip Pad1 */
}
- Follow-Ups:
- Re: [ethereal-dev] Padding patch for packet-smb.c
- From: Guy Harris
- Re: [ethereal-dev] Padding patch for packet-smb.c
- Prev by Date: Re: [ethereal-dev] Regarding EIGRP dissector
- Next by Date: Re: [ethereal-dev] Patch to detect IPX PING packets (CISCO and NOVELL sockets)
- Previous by thread: Re: [ethereal-dev] Regarding EIGRP dissector (patch included)
- Next by thread: Re: [ethereal-dev] Padding patch for packet-smb.c
- Index(es):





