]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-zephyr.c
Rename EXTRACT_ macros
[tcpdump] / print-zephyr.c
index 700d0bc088a5b24f6acf0f77c9490bcb4bee9836..735e273f0770bff33fa1dc962a497eb5514bae1e 100644 (file)
  * PURPOSE.
  */
 
+/* \summary: Zephyr printer */
+
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <tcpdump-stdinc.h>
+#include <netdissect-stdinc.h>
 
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 
-#include "interface.h"
+#include "netdissect.h"
 
 struct z_packet {
     const char *version;
@@ -74,30 +76,41 @@ static const struct tok z_types[] = {
     { Z_PACKET_SERVACK,                "serv-ack" },
     { Z_PACKET_SERVNAK,                "serv-nak" },
     { Z_PACKET_CLIENTACK,      "client-ack" },
-    { Z_PACKET_STAT,           "stat" }
+    { Z_PACKET_STAT,           "stat" },
+    { 0,                       NULL }
 };
 
 static char z_buf[256];
 
 static const char *
-parse_field(netdissect_options *ndo, const char **pptr, int *len)
+parse_field(netdissect_options *ndo, const char **pptr, int *len, int *truncated)
 {
     const char *s;
 
-    if (*len <= 0 || !pptr || !*pptr)
-       return NULL;
-    if (*pptr > (const char *) ndo->ndo_snapend)
-       return NULL;
-
+    /* Start of string */
     s = *pptr;
-    while (*pptr <= (const char *) ndo->ndo_snapend && *len >= 0 && **pptr) {
+    /* Scan for the NUL terminator */
+    for (;;) {
+       if (*len == 0) {
+           /* Ran out of packet data without finding it */
+           return NULL;
+       }
+       if (!ND_TTEST(**pptr)) {
+           /* Ran out of captured data without finding it */
+           *truncated = 1;
+           return NULL;
+       }
+       if (**pptr == '\0') {
+           /* Found it */
+           break;
+       }
+       /* Keep scanning */
        (*pptr)++;
        (*len)--;
     }
+    /* Skip the NUL terminator */
     (*pptr)++;
     (*len)--;
-    if (*len < 0 || *pptr > (const char *) ndo->ndo_snapend)
-       return NULL;
     return s;
 }
 
@@ -136,6 +149,7 @@ zephyr_print(netdissect_options *ndo, const u_char *cp, int length)
     int parselen = length;
     const char *s;
     int lose = 0;
+    int truncated = 0;
 
     /* squelch compiler warnings */
 
@@ -146,8 +160,9 @@ zephyr_print(netdissect_options *ndo, const u_char *cp, int length)
     z.sender = 0;
     z.recipient = 0;
 
-#define PARSE_STRING                           \
-       s = parse_field(ndo, &parse, &parselen);        \
+#define PARSE_STRING                                           \
+       s = parse_field(ndo, &parse, &parselen, &truncated);    \
+       if (truncated) goto trunc;                              \
        if (!s) lose = 1;
 
 #define PARSE_FIELD_INT(field)                 \
@@ -180,10 +195,8 @@ zephyr_print(netdissect_options *ndo, const u_char *cp, int length)
     PARSE_FIELD_INT(z.multi);
     PARSE_FIELD_STR(z.multi_uid);
 
-    if (lose) {
-       ND_PRINT((ndo, " [|zephyr] (%d)", length));
-       return;
-    }
+    if (lose)
+        goto trunc;
 
     ND_PRINT((ndo, " zephyr"));
     if (strncmp(z.version+4, "0.2", 3)) {
@@ -315,4 +328,9 @@ zephyr_print(netdissect_options *ndo, const u_char *cp, int length)
     ND_PRINT((ndo, " to %s", z_triple(z.class, z.inst, z.recipient)));
     if (*z.opcode)
        ND_PRINT((ndo, " op %s", z.opcode));
+    return;
+
+trunc:
+    ND_PRINT((ndo, " [|zephyr] (%d)", length));
+    return;
 }