]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-tcp.c
Merge pull request #704 from nmap/win32-isatty
[tcpdump] / print-tcp.c
index 6deb97b328eda7e9c10eaac91af49d4ea36e873d..a7b60b8ee8057ce3feb6e82db95044e6cd98579b 100644 (file)
@@ -173,6 +173,7 @@ tcp_print(netdissect_options *ndo,
         int rev;
         const struct ip6_hdr *ip6;
 
+       ndo->ndo_protocol = "tcp";
         tp = (const struct tcphdr *)bp;
         ip = (const struct ip *)bp2;
         if (IP_V(ip) == 6)
@@ -182,14 +183,15 @@ tcp_print(netdissect_options *ndo,
         ch = '\0';
         if (!ND_TTEST_2(tp->th_dport)) {
                if (ip6) {
-                        ND_PRINT("%s > %s: ",
+                        ND_PRINT("%s > %s:",
                                      ip6addr_string(ndo, ip6->ip6_src),
                                      ip6addr_string(ndo, ip6->ip6_dst));
                } else {
-                       ND_PRINT("%s > %s: [|tcp]",
-                                    ipaddr_string(ndo, ip->ip_src),
+                       ND_PRINT("%s > %s:",
+                                    ipaddr_string(ndo, ip->ip_src),
                                     ipaddr_string(ndo, ip->ip_dst));
                 }
+                nd_print_trunc(ndo);
                 return;
         }
 
@@ -262,22 +264,22 @@ tcp_print(netdissect_options *ndo,
                         struct tha6 tha;
 
                         tcp_seq_hash = tcp_seq_hash6;
-                        src = (const void *)&ip6->ip6_src;
-                        dst = (const void *)&ip6->ip6_dst;
+                        src = (const void *)ip6->ip6_src;
+                        dst = (const void *)ip6->ip6_dst;
                         if (sport > dport)
                                 rev = 1;
                         else if (sport == dport) {
-                                if (UNALIGNED_MEMCMP(src, dst, sizeof ip6->ip6_dst) > 0)
+                                if (UNALIGNED_MEMCMP(src, dst, sizeof(ip6->ip6_dst)) > 0)
                                         rev = 1;
                         }
                         if (rev) {
-                                UNALIGNED_MEMCPY(&tha.src, dst, sizeof ip6->ip6_dst);
-                                UNALIGNED_MEMCPY(&tha.dst, src, sizeof ip6->ip6_src);
-                                tha.port = dport << 16 | sport;
+                                UNALIGNED_MEMCPY(&tha.src, dst, sizeof(ip6->ip6_dst));
+                                UNALIGNED_MEMCPY(&tha.dst, src, sizeof(ip6->ip6_src));
+                                tha.port = ((u_int)dport) << 16 | sport;
                         } else {
-                                UNALIGNED_MEMCPY(&tha.dst, dst, sizeof ip6->ip6_dst);
-                                UNALIGNED_MEMCPY(&tha.src, src, sizeof ip6->ip6_src);
-                                tha.port = sport << 16 | dport;
+                                UNALIGNED_MEMCPY(&tha.dst, dst, sizeof(ip6->ip6_dst));
+                                UNALIGNED_MEMCPY(&tha.src, src, sizeof(ip6->ip6_src));
+                                tha.port = ((u_int)sport) << 16 | dport;
                         }
 
                         for (th = &tcp_seq_hash[tha.port % TSEQ_HASHSIZE];
@@ -288,12 +290,15 @@ tcp_print(netdissect_options *ndo,
 
                         if (!th->nxt || (flags & TH_SYN)) {
                                 /* didn't find it or new conversation */
+                               /* calloc() return used by the 'tcp_seq_hash6'
+                                  hash table: do not free() */
                                 if (th->nxt == NULL) {
                                         th->nxt = (struct tcp_seq_hash6 *)
                                                 calloc(1, sizeof(*th));
                                         if (th->nxt == NULL)
                                                 (*ndo->ndo_error)(ndo,
-                                                                 "tcp_print: calloc");
+                                                       S_ERR_ND_MEM_ALLOC,
+                                                       "tcp_print: calloc");
                                 }
                                 th->addr = tha;
                                 if (rev)
@@ -318,21 +323,21 @@ tcp_print(netdissect_options *ndo,
                         if (sport > dport)
                                 rev = 1;
                         else if (sport == dport) {
-                                if (UNALIGNED_MEMCMP(ip->ip_src, ip->ip_dst, sizeof ip->ip_dst) > 0)
+                                if (UNALIGNED_MEMCMP(ip->ip_src, ip->ip_dst, sizeof(ip->ip_dst)) > 0)
                                         rev = 1;
                         }
                         if (rev) {
                                 UNALIGNED_MEMCPY(&tha.src, ip->ip_dst,
-                                                 sizeof ip->ip_dst);
+                                                 sizeof(ip->ip_dst));
                                 UNALIGNED_MEMCPY(&tha.dst, ip->ip_src,
-                                                 sizeof ip->ip_src);
-                                tha.port = dport << 16 | sport;
+                                                 sizeof(ip->ip_src));
+                                tha.port = ((u_int)dport) << 16 | sport;
                         } else {
                                 UNALIGNED_MEMCPY(&tha.dst, ip->ip_dst,
-                                                 sizeof ip->ip_dst);
+                                                 sizeof(ip->ip_dst));
                                 UNALIGNED_MEMCPY(&tha.src, ip->ip_src,
-                                                 sizeof ip->ip_src);
-                                tha.port = sport << 16 | dport;
+                                                 sizeof(ip->ip_src));
+                                tha.port = ((u_int)sport) << 16 | dport;
                         }
 
                         for (th = &tcp_seq_hash[tha.port % TSEQ_HASHSIZE];
@@ -343,12 +348,15 @@ tcp_print(netdissect_options *ndo,
 
                         if (!th->nxt || (flags & TH_SYN)) {
                                 /* didn't find it or new conversation */
+                               /* calloc() return used by the 'tcp_seq_hash4'
+                                  hash table: do not free() */
                                 if (th->nxt == NULL) {
                                         th->nxt = (struct tcp_seq_hash *)
                                                 calloc(1, sizeof(*th));
                                         if (th->nxt == NULL)
                                                 (*ndo->ndo_error)(ndo,
-                                                                 "tcp_print: calloc");
+                                                       S_ERR_ND_MEM_ALLOC,
+                                                       "tcp_print: calloc");
                                 }
                                 th->addr = tha;
                                 if (rev)
@@ -729,6 +737,12 @@ tcp_print(netdissect_options *ndo,
                 rtsp_print(ndo, bp, length);
         } else if (length > 2 &&
                  (IS_SRC_OR_DST_PORT(NAMESERVER_PORT))) {
+                /* domain_print() assumes it does not have to prepend a space before its
+                 * own output to separate it from the output of the calling function. This
+                 * works well with udp_print(), but requires a small prop here.
+                 */
+                ND_PRINT(" ");
+
                 /*
                  * TCP DNS query has 2byte length at the head.
                  * XXX packet could be unaligned, it can go strange
@@ -779,10 +793,10 @@ tcp_print(netdissect_options *ndo,
  bad:
         ND_PRINT("[bad opt]");
         if (ch != '\0')
-                ND_PRINT(">");
+                ND_PRINT("]");
         return;
  trunc:
-        ND_PRINT("[|tcp]");
+        nd_print_trunc(ndo);
         if (ch != '\0')
                 ND_PRINT(">");
 }
@@ -817,7 +831,7 @@ print_tcp_rst_data(netdissect_options *ndo,
         while (length-- && sp < ndo->ndo_snapend) {
                 c = EXTRACT_U_1(sp);
                 sp++;
-                safeputchar(ndo, c);
+                fn_print_char(ndo, c);
         }
         ND_PRINT("]");
 }
@@ -929,10 +943,3 @@ tcp_verify_signature(netdissect_options *ndo,
 }
 USES_APPLE_RST
 #endif /* HAVE_LIBCRYPTO */
-
-/*
- * Local Variables:
- * c-style: whitesmith
- * c-basic-offset: 8
- * End:
- */