#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-smb.c,v 1.8 2001-01-15 03:24:00 guy Exp $";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-smb.c,v 1.10 2001-02-20 19:28:02 fenner Exp $";
#endif
#include <stdio.h>
fn = smbfind(command,smb_fns);
- printf("\nSMB PACKET: %s (%s)\n",fn->name,request?"REQUEST":"REPLY");
+ if (vflag > 1)
+ printf("\n");
- if (vflag == 0) return;
+ printf("SMB PACKET: %s (%s)\n",fn->name,request?"REQUEST":"REPLY");
+
+ if (vflag < 2)
+ return;
/* print out the header */
fdata(buf,fmt_smbheader,buf+33);
startbuf = data;
if (maxbuf <= data) return;
- printf("\n>>> NBT Packet\n");
+ if (vflag > 1)
+ printf ("\n>>> ");
+
+ printf("NBT Packet");
+ if (vflag < 2)
+ return;
+
+ printf("\n");
+
switch (flags) {
case 1:
printf("flags=0x%x\n", flags);
if (maxbuf <= data) return;
- printf("\n>>> NBT UDP PACKET(137): ");
+ if (vflag > 1)
+ printf("\n>>> ");
+
+ printf("NBT UDP PACKET(137): ");
switch (opcode) {
case 0: opcodestr = "QUERY"; break;
else
printf("; UNICAST");
- if (vflag == 0) return;
+ if (vflag < 2)
+ return;
printf("\nTrnID=0x%X\nOpCode=%d\nNmFlags=0x%X\nRcode=%d\nQueryCount=%d\nAnswerCount=%d\nAuthorityCount=%d\nAddressRecCount=%d\n",
name_trn_id,opcode,nm_flags,rcode,qdcount,ancount,nscount,arcount);
void nbt_udp138_print(const uchar *data, int length)
{
const uchar *maxbuf = data + length;
- startbuf = data;
+
+ if (maxbuf > snapend) maxbuf = snapend;
if (maxbuf <= data) return;
+ startbuf = data;
+
+ if (vflag < 2) {
+ printf("NBT UDP PACKET(138)");
+ return;
+ }
data = fdata(data,"\n>>> NBT UDP PACKET(138) Res=[rw] ID=[rw] IP=[b.b.b.b] Port=[rd] Length=[rd] Res2=[rw]\nSourceName=[n1]\nDestName=[n1]\n#",maxbuf);
/*
print netbeui frames
*/
-void netbeui_print(u_short control, const uchar *data, const uchar *maxbuf)
+void netbeui_print(u_short control, const uchar *data, int length)
{
- int len = SVAL(data,0);
- int command = CVAL(data,4);
- const uchar *data2 = data + len;
+ const uchar *maxbuf = data + length;
+ int len;
+ int command;
+ const uchar *data2;
int is_truncated = 0;
+ if (maxbuf > snapend)
+ maxbuf = snapend;
+ if (&data[7] >= maxbuf)
+ goto out;
+ len = SVAL(data,0);
+ command = CVAL(data,4);
+ data2 = data + len;
if (data2 >= maxbuf) {
data2 = maxbuf;
is_truncated = 1;
startbuf = data;
+ if (vflag < 2) {
+ printf("NetBeui Packet");
+ return;
+ }
+
printf("\n>>> NetBeui Packet\nType=0x%X ", control);
data = fdata(data,"Length=[d] Signature=[w] Command=[B]\n#",maxbuf);
if (data == NULL)
}
/* If there isn't enough data for "\377SMB", don't look for it. */
- if (!TTEST2(data2[3], 4))
+ if (&data2[3] >= maxbuf)
goto out;
if (memcmp(data2,"\377SMB",4)==0) {
} else {
int i;
for (i=0;i<128;i++) {
- if (!TTEST2(data2[i], 4))
- break;
if (&data2[i+3] >= maxbuf)
break;
if (memcmp(&data2[i],"\377SMB",4)==0) {
const uchar *maxbuf;
maxbuf = data + length;
+ /* Don't go past the end of the captured data in the packet. */
+ if (maxbuf > snapend)
+ maxbuf = snapend;
startbuf = data;
for (i=0;i<128;i++) {
- if (!TTEST2(data[i], 4))
- break;
if (&data[i+3] >= maxbuf)
break;
if (memcmp(&data[i],"\377SMB",4)==0) {