]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-smb.c
Fix checksum and offset printing.
[tcpdump] / print-smb.c
index f3002e0950ce1ccbb029a28256dfd53b7b6052d2..48b0eead4081ee8db48ff44c2e2f3f21ffd03d59 100644 (file)
@@ -11,7 +11,7 @@
 
 #ifndef lint
 static const char rcsid[] =
 
 #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>
 #endif
 
 #include <stdio.h>
@@ -624,9 +624,13 @@ static void print_smb(const uchar *buf, const uchar *maxbuf)
 
   fn = smbfind(command,smb_fns);
 
 
   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);
 
   /* print out the header */
   fdata(buf,fmt_smbheader,buf+33);
@@ -712,8 +716,16 @@ void nbt_tcp_print(const uchar *data,int length)
   startbuf = data;
   if (maxbuf <= data) return;
 
   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);
   switch (flags) {
   case 1:    
     printf("flags=0x%x\n", flags);
@@ -798,7 +810,10 @@ void nbt_udp137_print(const uchar *data, int length)
 
   if (maxbuf <= data) return;
 
 
   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;
 
   switch (opcode) {
   case 0: opcodestr = "QUERY"; break;
@@ -827,7 +842,8 @@ void nbt_udp137_print(const uchar *data, int length)
   else
     printf("; UNICAST");
   
   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);
 
   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);
@@ -918,8 +934,15 @@ out:
 void nbt_udp138_print(const uchar *data, int length)
 {
   const uchar *maxbuf = data + length;
 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;
   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);
 
 
   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);
 
@@ -935,13 +958,21 @@ void nbt_udp138_print(const uchar *data, int length)
 /*
    print netbeui frames 
 */
 /*
    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;
 
   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;
   if (data2 >= maxbuf) {
     data2 = maxbuf;
     is_truncated = 1;
@@ -949,6 +980,11 @@ void netbeui_print(u_short control, const uchar *data, const uchar *maxbuf)
 
   startbuf = data;
 
 
   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)
   printf("\n>>> NetBeui Packet\nType=0x%X ", control);
   data = fdata(data,"Length=[d] Signature=[w] Command=[B]\n#",maxbuf);
   if (data == NULL)
@@ -1004,7 +1040,7 @@ void netbeui_print(u_short control, const uchar *data, const uchar *maxbuf)
   }
 
   /* If there isn't enough data for "\377SMB", don't look for it. */
   }
 
   /* 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) {
     goto out;
 
   if (memcmp(data2,"\377SMB",4)==0) {
@@ -1012,8 +1048,6 @@ void netbeui_print(u_short control, const uchar *data, const uchar *maxbuf)
   } else {
     int i;
     for (i=0;i<128;i++) {
   } 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) {
       if (&data2[i+3] >= maxbuf)
         break;
       if (memcmp(&data2[i],"\377SMB",4)==0) {
@@ -1040,10 +1074,11 @@ void ipx_netbios_print(const uchar *data, u_int length)
   const uchar *maxbuf;
 
   maxbuf = data + length;
   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++) {
   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) {
     if (&data[i+3] >= maxbuf)
       break;
     if (memcmp(&data[i],"\377SMB",4)==0) {