]> The Tcpdump Group git mirrors - tcpdump/blobdiff - util.c
Add some additional bounds checking.
[tcpdump] / util.c
diff --git a/util.c b/util.c
index 36b8611c77d1d410e4fc00b2a3391fee57149eba..97d352720e407cc1da965f16bd1c7f80a8a52761 100644 (file)
--- a/util.c
+++ b/util.c
@@ -20,8 +20,8 @@
  */
 
 #ifndef lint
-static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.86 2003-07-30 00:20:28 guy Exp $ (LBL)";
+static const char rcsid[] _U_ =
+    "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.94 2004-06-15 23:05:06 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -116,19 +116,25 @@ ts_print(register const struct timeval *tvp)
        static unsigned b_sec;
        static unsigned b_usec;
 
-       switch(tflag) {
-       case 1: /* Default */
+       switch (tflag) {
+
+       case 0: /* Default */
                s = (tvp->tv_sec + thiszone) % 86400;
                (void)printf("%02d:%02d:%02d.%06u ",
                             s / 3600, (s % 3600) / 60, s % 60,
                             (unsigned)tvp->tv_usec);
                break;
-       case -1: /* Unix timeval style */
+
+       case 1: /* No time stamp */
+               break;
+
+       case 2: /* Unix timeval style */
                (void)printf("%u.%06u ",
                             (unsigned)tvp->tv_sec,
                             (unsigned)tvp->tv_usec);
                break;
-       case -2:
+
+       case 3: /* Microseconds since previous packet */
                if (b_sec == 0) {
                        printf("000000 ");
                } else {
@@ -146,7 +152,8 @@ ts_print(register const struct timeval *tvp)
                b_sec = tvp->tv_sec;
                b_usec = tvp->tv_usec;
                break;
-       case -3: /* Default + Date*/
+
+       case 4: /* Default + Date*/
                s = (tvp->tv_sec + thiszone) % 86400;
                Time = (tvp->tv_sec + thiszone) - s;
                tm = gmtime (&Time);
@@ -199,27 +206,9 @@ relts_print(int secs)
  */
 
 int
-print_unknown_data(const u_char *cp,const char *lf,int len)
+print_unknown_data(const u_char *cp,const char *ident,int len)
 {
-        int i;
-
-        if (len ==0)
-           return(0);
-
-       printf("%s0x0000: ",lf);
-       for(i=0;i<len;i++) {
-           if (!TTEST2(*(cp+i), 1)) {
-              printf("%spacket exceeded snapshot",lf);
-              return(0);
-            }
-           printf("%02x",*(cp+i));
-           if (i%2)
-               printf(" ");
-           if (i/16!=(i+1)/16) {
-               if (i<(len-1))
-                   printf("%s0x%04x: ",lf,i);
-           }
-       }
+        hex_print(ident,cp,len);
        return(1); /* everything is ok */
 }
 
@@ -227,11 +216,9 @@ print_unknown_data(const u_char *cp,const char *lf,int len)
  * Convert a token value to a string; use "fmt" if not found.
  */
 const char *
-tok2str(register const struct tok *lp, register const char *fmt,
-       register int v)
+tok2strbuf(register const struct tok *lp, register const char *fmt,
+          register int v, char *buf, size_t bufsize)
 {
-       static char buf[128];
-
        while (lp->s != NULL) {
                if (lp->v == v)
                        return (lp->s);
@@ -239,8 +226,25 @@ tok2str(register const struct tok *lp, register const char *fmt,
        }
        if (fmt == NULL)
                fmt = "#%d";
-       (void)snprintf(buf, sizeof(buf), fmt, v);
-       return (buf);
+
+       (void)snprintf(buf, bufsize, fmt, v);
+       return (const char *)buf;
+}
+
+/*
+ * Convert a token value to a string; use "fmt" if not found.
+ */
+const char *
+tok2str(register const struct tok *lp, register const char *fmt,
+       register int v)
+{
+       static char buf[4][128];
+       static int idx = 0;
+       char *ret;
+
+       ret = buf[idx];
+       idx = (idx+1) & 3;
+       return tok2strbuf(lp, fmt, v, ret, sizeof(buf[0]));
 }
 
 /*
@@ -249,7 +253,7 @@ tok2str(register const struct tok *lp, register const char *fmt,
  */
 char *
 bittok2str(register const struct tok *lp, register const char *fmt,
-       register int v)
+          register int v)
 {
         static char buf[256]; /* our stringbuffer */
         int buflen=0;