]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-nfs.c
Add some additional bounds checking.
[tcpdump] / print-nfs.c
index a9ed4db2b755faeb01cd8b702c80a263ec3f82be..6c528b7c3ed26f34654c8a9bd48c3b9839dbb70c 100644 (file)
@@ -20,8 +20,8 @@
  */
 
 #ifndef lint
-static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-nfs.c,v 1.98 2002-12-11 07:14:05 guy Exp $ (LBL)";
+static const char rcsid[] _U_ =
+    "@(#) $Header: /tcpdump/master/tcpdump/print-nfs.c,v 1.104 2004-12-27 00:41:31 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -30,8 +30,6 @@ static const char rcsid[] =
 
 #include <tcpdump-stdinc.h>
 
-#include <rpc/rpc.h>
-
 #include <pcap.h>
 #include <stdio.h>
 #include <string.h>
@@ -47,12 +45,14 @@ static const char rcsid[] =
 #ifdef INET6
 #include "ip6.h"
 #endif
+#include "rpc_auth.h"
+#include "rpc_msg.h"
 
 static void nfs_printfh(const u_int32_t *, const u_int);
-static void xid_map_enter(const struct rpc_msg *, const u_char *);
-static int32_t xid_map_find(const struct rpc_msg *, const u_char *,
+static void xid_map_enter(const struct sunrpc_msg *, const u_char *);
+static int32_t xid_map_find(const struct sunrpc_msg *, const u_char *,
                            u_int32_t *, u_int32_t *);
-static void interp_reply(const struct rpc_msg *, u_int32_t, u_int32_t, int);
+static void interp_reply(const struct sunrpc_msg *, u_int32_t, u_int32_t, int);
 static const u_int32_t *parse_post_op_attr(const u_int32_t *, int);
 static void print_sattr3(const struct nfsv3_sattr *sa3, int verbose);
 static int print_int64(const u_int32_t *dp, int how);
@@ -162,8 +162,8 @@ static struct tok type2str[] = {
  * try to make the best of it. The integer stored as 2 consecutive XDR
  * encoded 32-bit integers, to which a pointer is passed.
  *
- * Assume that a system that has INT64_FORMAT defined, has a 64-bit
- * integer datatype and can print it.
+ * We assume that PRId64, PRIu64, and PRIx64 are defined, and that
+ * u_int64_t is defined.
  */
 
 #define UNSIGNED 0
@@ -172,42 +172,23 @@ static struct tok type2str[] = {
 
 static int print_int64(const u_int32_t *dp, int how)
 {
-#ifdef INT64_FORMAT
        u_int64_t res;
 
-       res = ((u_int64_t)EXTRACT_32BITS(&dp[0]) << 32) | (u_int64_t)EXTRACT_32BITS(&dp[1]);
+       res = EXTRACT_64BITS((u_int8_t *)dp);
        switch (how) {
        case SIGNED:
-               printf(INT64_FORMAT, res);
+               printf("%" PRId64, res);
                break;
        case UNSIGNED:
-               printf(U_INT64_FORMAT, res);
-               break;
-       case HEX:
-               printf(HEX_INT64_FORMAT, res);
+               printf("%" PRIu64, res);
                break;
-       default:
-               return (0);
-       }
-#else
-       u_int32_t high;
-
-       high = EXTRACT_32BITS(&dp[0]);
-
-       switch (how) {
-       case SIGNED:
-       case UNSIGNED:
        case HEX:
-               if (high != 0)
-                       printf("0x%x%08x", high, EXTRACT_32BITS(&dp[1]));
-               else
-                       printf("0x%x", EXTRACT_32BITS(&dp[1]));
+               printf("%" PRIx64, res);
                break;
        default:
                return (0);
        }
-#endif
-       return 1;
+       return (1);
 }
 
 static void
@@ -340,12 +321,12 @@ void
 nfsreply_print(register const u_char *bp, u_int length,
               register const u_char *bp2)
 {
-       register const struct rpc_msg *rp;
+       register const struct sunrpc_msg *rp;
        u_int32_t proc, vers;
        char srcid[20], dstid[20];      /*fits 32bit*/
 
        nfserr = 0;             /* assume no error */
-       rp = (const struct rpc_msg *)bp;
+       rp = (const struct sunrpc_msg *)bp;
 
        if (!nflag) {
                strlcpy(srcid, "nfs", sizeof(srcid));
@@ -358,9 +339,9 @@ nfsreply_print(register const u_char *bp, u_int length,
        }
        print_nfsaddr(bp2, srcid, dstid);
        (void)printf("reply %s %d",
-                    EXTRACT_32BITS(&rp->rm_reply.rp_stat) == MSG_ACCEPTED?
-                            "ok":"ERR",
-                            length);
+            EXTRACT_32BITS(&rp->rm_reply.rp_stat) == SUNRPC_MSG_ACCEPTED?
+                    "ok":"ERR",
+            length);
 
        if (xid_map_find(rp, bp2, &proc, &vers) >= 0)
                interp_reply(rp, proc, vers, length);
@@ -371,7 +352,7 @@ nfsreply_print(register const u_char *bp, u_int length,
  * If the packet was truncated, return 0.
  */
 static const u_int32_t *
-parsereq(register const struct rpc_msg *rp, register u_int length)
+parsereq(register const struct sunrpc_msg *rp, register u_int length)
 {
        register const u_int32_t *dp;
        register u_int len;
@@ -471,7 +452,7 @@ void
 nfsreq_print(register const u_char *bp, u_int length,
     register const u_char *bp2)
 {
-       register const struct rpc_msg *rp;
+       register const struct sunrpc_msg *rp;
        register const u_int32_t *dp;
        nfs_type type;
        int v3;
@@ -480,7 +461,7 @@ nfsreq_print(register const u_char *bp, u_int length,
        char srcid[20], dstid[20];      /*fits 32bit*/
 
        nfserr = 0;             /* assume no error */
-       rp = (const struct rpc_msg *)bp;
+       rp = (const struct sunrpc_msg *)bp;
        if (!nflag) {
                snprintf(srcid, sizeof(srcid), "%u",
                    EXTRACT_32BITS(&rp->rm_xid));
@@ -859,7 +840,7 @@ int xid_map_next = 0;
 int    xid_map_hint = 0;
 
 static void
-xid_map_enter(const struct rpc_msg *rp, const u_char *bp)
+xid_map_enter(const struct sunrpc_msg *rp, const u_char *bp)
 {
        struct ip *ip = NULL;
 #ifdef INET6
@@ -907,7 +888,7 @@ xid_map_enter(const struct rpc_msg *rp, const u_char *bp)
  * version in vers return, or returns -1 on failure
  */
 static int
-xid_map_find(const struct rpc_msg *rp, const u_char *bp, u_int32_t *proc,
+xid_map_find(const struct sunrpc_msg *rp, const u_char *bp, u_int32_t *proc,
             u_int32_t *vers)
 {
        int i;
@@ -974,11 +955,11 @@ xid_map_find(const struct rpc_msg *rp, const u_char *bp, u_int32_t *proc,
  * If the packet was truncated, return 0.
  */
 static const u_int32_t *
-parserep(register const struct rpc_msg *rp, register u_int length)
+parserep(register const struct sunrpc_msg *rp, register u_int length)
 {
        register const u_int32_t *dp;
        u_int len;
-       enum accept_stat astat;
+       enum sunrpc_accept_stat astat;
 
        /*
         * Portability note:
@@ -1012,30 +993,30 @@ parserep(register const struct rpc_msg *rp, register u_int length)
        astat = EXTRACT_32BITS(dp);
        switch (astat) {
 
-       case SUCCESS:
+       case SUNRPC_SUCCESS:
                break;
 
-       case PROG_UNAVAIL:
+       case SUNRPC_PROG_UNAVAIL:
                printf(" PROG_UNAVAIL");
                nfserr = 1;             /* suppress trunc string */
                return (NULL);
 
-       case PROG_MISMATCH:
+       case SUNRPC_PROG_MISMATCH:
                printf(" PROG_MISMATCH");
                nfserr = 1;             /* suppress trunc string */
                return (NULL);
 
-       case PROC_UNAVAIL:
+       case SUNRPC_PROC_UNAVAIL:
                printf(" PROC_UNAVAIL");
                nfserr = 1;             /* suppress trunc string */
                return (NULL);
 
-       case GARBAGE_ARGS:
+       case SUNRPC_GARBAGE_ARGS:
                printf(" GARBAGE_ARGS");
                nfserr = 1;             /* suppress trunc string */
                return (NULL);
 
-       case SYSTEM_ERR:
+       case SUNRPC_SYSTEM_ERR:
                printf(" SYSTEM_ERR");
                nfserr = 1;             /* suppress trunc string */
                return (NULL);
@@ -1091,47 +1072,46 @@ parsefattr(const u_int32_t *dp, int verbose, int v3)
                        TCHECK(fap->fa3_size);
                        printf(" sz ");
                        print_int64((u_int32_t *)&fap->fa3_size, UNSIGNED);
-                       putchar(' ');
                } else {
                        TCHECK(fap->fa2_size);
-                       printf(" sz %d ", EXTRACT_32BITS(&fap->fa2_size));
+                       printf(" sz %d", EXTRACT_32BITS(&fap->fa2_size));
                }
        }
        /* print lots more stuff */
        if (verbose > 1) {
                if (v3) {
                        TCHECK(fap->fa3_ctime);
-                       printf("nlink %d rdev %d/%d ",
+                       printf(" nlink %d rdev %d/%d",
                               EXTRACT_32BITS(&fap->fa_nlink),
                               EXTRACT_32BITS(&fap->fa3_rdev.specdata1),
                               EXTRACT_32BITS(&fap->fa3_rdev.specdata2));
-                       printf("fsid ");
+                       printf(" fsid ");
                        print_int64((u_int32_t *)&fap->fa3_fsid, HEX);
-                       printf(" nodeid ");
+                       printf(" fileid ");
                        print_int64((u_int32_t *)&fap->fa3_fileid, HEX);
-                       printf(" a/m/ctime %u.%06u ",
+                       printf(" a/m/ctime %u.%06u",
                               EXTRACT_32BITS(&fap->fa3_atime.nfsv3_sec),
                               EXTRACT_32BITS(&fap->fa3_atime.nfsv3_nsec));
-                       printf("%u.%06u ",
+                       printf(" %u.%06u",
                               EXTRACT_32BITS(&fap->fa3_mtime.nfsv3_sec),
                               EXTRACT_32BITS(&fap->fa3_mtime.nfsv3_nsec));
-                       printf("%u.%06u ",
+                       printf(" %u.%06u",
                               EXTRACT_32BITS(&fap->fa3_ctime.nfsv3_sec),
                               EXTRACT_32BITS(&fap->fa3_ctime.nfsv3_nsec));
                } else {
                        TCHECK(fap->fa2_ctime);
-                       printf("nlink %d rdev %x fsid %x nodeid %x a/m/ctime ",
+                       printf(" nlink %d rdev %x fsid %x nodeid %x a/m/ctime",
                               EXTRACT_32BITS(&fap->fa_nlink),
                               EXTRACT_32BITS(&fap->fa2_rdev),
                               EXTRACT_32BITS(&fap->fa2_fsid),
                               EXTRACT_32BITS(&fap->fa2_fileid));
-                       printf("%u.%06u ",
+                       printf(" %u.%06u",
                               EXTRACT_32BITS(&fap->fa2_atime.nfsv2_sec),
                               EXTRACT_32BITS(&fap->fa2_atime.nfsv2_usec));
-                       printf("%u.%06u ",
+                       printf(" %u.%06u",
                               EXTRACT_32BITS(&fap->fa2_mtime.nfsv2_sec),
                               EXTRACT_32BITS(&fap->fa2_mtime.nfsv2_usec));
-                       printf("%u.%06u ",
+                       printf(" %u.%06u",
                               EXTRACT_32BITS(&fap->fa2_ctime.nfsv2_sec),
                               EXTRACT_32BITS(&fap->fa2_ctime.nfsv2_usec));
                }
@@ -1353,7 +1333,7 @@ parsecreateopres(const u_int32_t *dp, int verbose)
                        if (!(dp = parse_post_op_attr(dp, verbose)))
                                return (0);
                        if (vflag > 1) {
-                               printf("dir attr:");
+                               printf(" dir attr:");
                                dp = parse_wcc_data(dp, verbose);
                        }
                }
@@ -1464,7 +1444,7 @@ trunc:
 }
 
 static void
-interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int length)
+interp_reply(const struct sunrpc_msg *rp, u_int32_t proc, u_int32_t vers, int length)
 {
        register const u_int32_t *dp;
        register int v3;
@@ -1568,7 +1548,7 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
                                return;
                        if (vflag) {
                                TCHECK(dp[1]);
-                               printf("%u bytes", EXTRACT_32BITS(&dp[0]));
+                               printf(" %u bytes", EXTRACT_32BITS(&dp[0]));
                                if (EXTRACT_32BITS(&dp[1]))
                                        printf(" EOF");
                        }
@@ -1592,7 +1572,7 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
                                return;
                        if (vflag) {
                                TCHECK(dp[0]);
-                               printf("%u bytes", EXTRACT_32BITS(&dp[0]));
+                               printf(" %u bytes", EXTRACT_32BITS(&dp[0]));
                                if (vflag > 1) {
                                        TCHECK(dp[1]);
                                        printf(" <%s>",