]> The Tcpdump Group git mirrors - tcpdump/commitdiff
Fix confusing indentation.
authorfenner <fenner>
Fri, 28 Jan 2000 00:04:19 +0000 (00:04 +0000)
committerfenner <fenner>
Fri, 28 Jan 2000 00:04:19 +0000 (00:04 +0000)
Get rid of T2CHECK() in favor of TCHECK() or TCHECK2().
Use TCHECK() etc. instead of comparing vs. snapend.
Replace strerr() with pcap_strerror(), and don't use errno as a local variable.
Use tok2str() for nfsv3_writemodes to avoid array overrun by corrupt packets.

print-nfs.c

index ec49f09300663aa61bcea242afb1a1d34befb8e1..64da5ca6d8074cc8327723e23abdef8c9b79ec25 100644 (file)
@@ -21,7 +21,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-nfs.c,v 1.69 1999-12-15 06:57:25 fenner Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-nfs.c,v 1.70 2000-01-28 00:04:19 fenner Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -97,10 +97,11 @@ u_int32_t nfsv3_procid[NFS_NPROCS] = {
        NFSPROC_NOOP
 };
 
-const char *nfsv3_writemodes[NFSV3WRITE_NMODES] = {
-       "unstable",
-       "datasync",
-       "filesync"
+static struct tok nfsv3_writemodes[] = {
+       { 0,            "unstable" },
+       { 1,            "datasync" },
+       { 2,            "filesync" },
+       { 0,            NULL }
 };
 
 static struct tok type2str[] = {
@@ -163,59 +164,47 @@ static int print_int64(const u_int32_t *dp, int how)
 static const u_int32_t *
 parse_sattr3(const u_int32_t *dp, struct nfsv3_sattr *sa3)
 {
-       register const u_int32_t *ep = (u_int32_t *)snapend;
-
-       if (dp + 1 > ep)
-               return (0);
+       TCHECK(dp[0]);
        if ((sa3->sa_modeset = ntohl(*dp++))) {
-               if (dp + 1 > ep)
-                       return (0);
+               TCHECK(dp[0]);
                sa3->sa_mode = ntohl(*dp++);
        }
 
-       if (dp + 1 > ep)
-               return (0);
+       TCHECK(dp[0]);
        if ((sa3->sa_uidset = ntohl(*dp++))) {
-               if (dp + 1 > ep)
-                       return (0);
+               TCHECK(dp[0]);
                sa3->sa_uid = ntohl(*dp++);
        }
 
-       if (dp + 1 > ep)
-               return (0);
+       TCHECK(dp[0]);
        if ((sa3->sa_gidset = ntohl(*dp++))) {
-               if (dp + 1 > ep)
-                       return (0);
+               TCHECK(dp[0]);
                sa3->sa_gid = ntohl(*dp++);
        }
 
-       if (dp + 1 > ep)
-               return (0);
+       TCHECK(dp[0]);
        if ((sa3->sa_sizeset = ntohl(*dp++))) {
-               if (dp + 1 > ep)
-                       return (0);
+               TCHECK(dp[0]);
                sa3->sa_size = ntohl(*dp++);
        }
 
-       if (dp + 1 > ep)
-               return (0);
+       TCHECK(dp[0]);
        if ((sa3->sa_atimetype = ntohl(*dp++)) == NFSV3SATTRTIME_TOCLIENT) {
-               if (dp + 2 > ep)
-                       return (0);
+               TCHECK(dp[1]);
                sa3->sa_atime.nfsv3_sec = ntohl(*dp++);
                sa3->sa_atime.nfsv3_nsec = ntohl(*dp++);
        }
 
-       if (dp + 1 > ep)
-               return (0);
+       TCHECK(dp[0]);
        if ((sa3->sa_mtimetype = ntohl(*dp++)) == NFSV3SATTRTIME_TOCLIENT) {
-               if (dp + 2 > ep)
-                       return (0);
+               TCHECK(dp[1]);
                sa3->sa_mtime.nfsv3_sec = ntohl(*dp++);
                sa3->sa_mtime.nfsv3_nsec = ntohl(*dp++);
        }
 
        return dp;
+trunc:
+       return NULL;
 }
 
 static int nfserr;             /* true if we error rather than trunc */
@@ -245,7 +234,7 @@ nfsreply_print(register const u_char *bp, u_int length,
 {
        register const struct rpc_msg *rp;
        register const struct ip *ip;
-       u_int32_t proc, vers;
+       u_int32_t proc, vers;
 
        nfserr = 0;             /* assume no error */
        rp = (const struct rpc_msg *)bp;
@@ -313,17 +302,17 @@ parsefh(register const u_int32_t *dp, int v3)
        int len;
 
        if (v3) {
-               if (dp + 1 > (u_int32_t *)snapend)
-                       return (0);
+               TCHECK(dp[0]);
                len = (int)ntohl(*dp) / 4;
                dp++;
        } else
                len = NFSX_V2FH / 4;
 
-       if (dp + len <= (u_int32_t *)snapend) {
+       if (TTEST2(*dp, len * sizeof(*dp))) {
                nfs_printfh(dp, len);
                return (dp + len);
        }
+trunc:
        return (NULL);
 }
 
@@ -338,24 +327,25 @@ parsefn(register const u_int32_t *dp)
        register const u_char *cp;
 
        /* Bail if we don't have the string length */
-       if ((u_char *)dp > snapend - sizeof(*dp))
-               return (NULL);
+       TCHECK(*dp);
 
        /* Fetch string length; convert to host order */
        len = *dp++;
        NTOHL(len);
 
+       TCHECK2(*dp, ((len + 3) & ~3));
+
        cp = (u_char *)dp;
        /* Update 32-bit pointer (NFS filenames padded to 32-bit boundaries) */
        dp += ((len + 3) & ~3) / sizeof(*dp);
-       if ((u_char *)dp > snapend)
-               return (NULL);
        /* XXX seems like we should be checking the length */
        putchar('"');
        (void) fn_printn(cp, len, NULL);
        putchar('"');
 
        return (dp);
+trunc:
+       return NULL;
 }
 
 /*
@@ -443,7 +433,7 @@ nfsreq_print(register const u_char *bp, u_int length,
                printf(" access");
                if ((dp = parsereq(rp, length)) != NULL &&
                    (dp = parsefh(dp, v3)) != NULL) {
-                       TCHECK2(dp[0], 4);
+                       TCHECK(dp[0]);
                        printf(" %04x", ntohl(dp[0]));
                        return;
                }
@@ -461,16 +451,16 @@ nfsreq_print(register const u_char *bp, u_int length,
                if ((dp = parsereq(rp, length)) != NULL &&
                    (dp = parsefh(dp, v3)) != NULL) {
                        if (v3) {
-                       TCHECK2(dp[0], 3 * sizeof(*dp));
+                               TCHECK(dp[2]);
                                printf(" %u bytes @ ",
                                       (u_int32_t) ntohl(dp[2]));
                                print_int64(dp, UNSIGNED);
                        } else {
-                               TCHECK2(dp[0], 2 * sizeof(*dp));
-                       printf(" %u bytes @ %u",
-                           (u_int32_t)ntohl(dp[1]),
-                           (u_int32_t)ntohl(dp[0]));
-               }
+                               TCHECK(dp[1]);
+                               printf(" %u bytes @ %u",
+                                   (u_int32_t)ntohl(dp[1]),
+                                   (u_int32_t)ntohl(dp[0]));
+                       }
                        return;
                }
                break;
@@ -480,23 +470,24 @@ nfsreq_print(register const u_char *bp, u_int length,
                if ((dp = parsereq(rp, length)) != NULL &&
                    (dp = parsefh(dp, v3)) != NULL) {
                        if (v3) {
-                               TCHECK2(dp[0], 3 * sizeof(*dp));
+                               TCHECK(dp[4]);
                                printf(" %u bytes @ ",
-                                   (u_int32_t) ntohl(dp[4]));
+                                               (u_int32_t) ntohl(dp[4]));
                                print_int64(dp, UNSIGNED);
                                if (vflag) {
                                        dp += 3;
-                                       TCHECK2(dp[0], sizeof(*dp));
+                                       TCHECK(dp[0]);
                                        printf(" <%s>",
-                                              nfsv3_writemodes[ntohl(*dp)]);
+                                               tok2str(nfsv3_writemodes,
+                                                       NULL, ntohl(*dp)));
                                }
                        } else {
-                       TCHECK2(dp[0], 4 * sizeof(*dp));
-                       printf(" %u (%u) bytes @ %u (%u)",
-                           (u_int32_t)ntohl(dp[3]),
-                           (u_int32_t)ntohl(dp[2]),
-                           (u_int32_t)ntohl(dp[1]),
-                           (u_int32_t)ntohl(dp[0]));
+                               TCHECK(dp[3]);
+                               printf(" %u (%u) bytes @ %u (%u)",
+                                               (u_int32_t)ntohl(dp[3]),
+                                               (u_int32_t)ntohl(dp[2]),
+                                               (u_int32_t)ntohl(dp[1]),
+                                               (u_int32_t)ntohl(dp[0]));
                        }
                        return;
                }
@@ -526,7 +517,7 @@ nfsreq_print(register const u_char *bp, u_int length,
                                break;
                        if (v3 && vflag)
                                print_sattr3(&sa3, vflag);
-                               return;
+                       return;
                }
                break;
 
@@ -534,21 +525,19 @@ nfsreq_print(register const u_char *bp, u_int length,
                printf(" mknod");
                if ((dp = parsereq(rp, length)) != 0 &&
                    (dp = parsefhn(dp, v3)) != 0) {
-                       if (dp + 1 > (u_int32_t *)snapend)
-                               break;
+                       TCHECK(*dp);
                        type = (nfstype)ntohl(*dp++);
                        if ((dp = parse_sattr3(dp, &sa3)) == 0)
                                break;
                        printf(" %s", tok2str(type2str, "unk-ft %d", type));
                        if (vflag && (type == NFCHR || type == NFBLK)) {
-                               if (dp + 2 > (u_int32_t *)snapend)
-                                       break;
+                               TCHECK(dp[1]);
                                printf(" %u/%u", ntohl(dp[0]), ntohl(dp[1]));
                                dp += 2;
                        }
                        if (vflag)
                                print_sattr3(&sa3, vflag);
-                               return;
+                       return;
                }
                break;
 
@@ -556,7 +545,7 @@ nfsreq_print(register const u_char *bp, u_int length,
                printf(" remove");
                if ((dp = parsereq(rp, length)) != NULL &&
                    parsefhn(dp, v3) != NULL)
-                               return;
+                       return;
                break;
 
        case NFSPROC_RMDIR:
@@ -582,7 +571,7 @@ nfsreq_print(register const u_char *bp, u_int length,
                    (dp = parsefh(dp, v3)) != NULL) {
                        fputs(" ->", stdout);
                        if (parsefhn(dp, v3) != NULL)
-                       return;
+                               return;
                }
                break;
 
@@ -591,7 +580,7 @@ nfsreq_print(register const u_char *bp, u_int length,
                if ((dp = parsereq(rp, length)) != NULL &&
                    (dp = parsefh(dp, v3)) != NULL) {
                        if (v3) {
-                               TCHECK2(dp[0], 20);
+                               TCHECK(dp[4]);
                                /*
                                 * We shouldn't really try to interpret the
                                 * offset cookie here.
@@ -603,14 +592,14 @@ nfsreq_print(register const u_char *bp, u_int length,
                                        printf(" verf %08x%08x", dp[2],
                                               dp[3]);
                        } else {
-                       TCHECK2(dp[0], 2 * sizeof(*dp));
-                       /*
+                               TCHECK(dp[1]);
+                               /*
                                 * Print the offset as signed, since -1 is
                                 * common, but offsets > 2^31 aren't.
-                        */
-                       printf(" %u bytes @ %d",
-                           (u_int32_t)ntohl(dp[1]),
-                           (u_int32_t)ntohl(dp[0]));
+                                */
+                               printf(" %u bytes @ %d",
+                                   (u_int32_t)ntohl(dp[1]),
+                                   (u_int32_t)ntohl(dp[0]));
                        }
                        return;
                }
@@ -620,7 +609,7 @@ nfsreq_print(register const u_char *bp, u_int length,
                printf(" readdirplus");
                if ((dp = parsereq(rp, length)) != NULL &&
                    (dp = parsefh(dp, v3)) != NULL) {
-                       TCHECK2(dp[0], 20);
+                       TCHECK(dp[4]);
                        /*
                         * We don't try to interpret the offset
                         * cookie here.
@@ -663,6 +652,7 @@ nfsreq_print(register const u_char *bp, u_int length,
                printf(" proc-%u", (u_int32_t)ntohl(rp->rm_call.cb_proc));
                return;
        }
+
 trunc:
        if (!nfserr)
                fputs(" [|nfs]", stdout);
@@ -688,19 +678,19 @@ nfs_printfh(register const u_int32_t *dp, const u_int len)
 
        if (sfsname) {
                /* file system ID is ASCII, not numeric, for this server OS */
-           static char temp[NFSX_V3FHMAX+1];
+               static char temp[NFSX_V3FHMAX+1];
 
                /* Make sure string is null-terminated */
-           strncpy(temp, sfsname, NFSX_V3FHMAX);
+               strncpy(temp, sfsname, NFSX_V3FHMAX);
                /* Remove trailing spaces */
                sfsname = strchr(temp, ' ');
                if (sfsname)
                        *sfsname = 0;
 
-           (void)printf(" fh %s/%ld", temp, (long) ino);
+               (void)printf(" fh %s/%ld", temp, (long) ino);
        }
        else {
-           (void)printf(" fh %d,%d/%ld",
+               (void)printf(" fh %d,%d/%ld",
                        fsid.Fsid_dev.Major, fsid.Fsid_dev.Minor,
                        (long) ino);
        }
@@ -750,7 +740,10 @@ xid_map_enter(const struct rpc_msg *rp, const struct ip *ip)
        xmep->vers = ntohl(rp->rm_call.cb_vers);
 }
 
-/* Returns NFSPROC_xxx or -1 on failure */
+/*
+ * Returns 0 and puts NFSPROC_xxx in proc return and
+ * version in vers return, or returns -1 on failure
+ */
 static int
 xid_map_find(const struct rpc_msg *rp, const struct ip *ip, u_int32_t *proc,
             u_int32_t *vers)
@@ -771,14 +764,14 @@ xid_map_find(const struct rpc_msg *rp, const struct ip *ip, u_int32_t *proc,
                        xid_map_hint = i;
                        *proc = xmep->proc;
                        *vers = xmep->vers;
-                       return 1;
+                       return 0;
                }
                if (++i >= XIDMAPSIZE)
                        i = 0;
        } while (i != xid_map_hint);
 
        /* search failed */
-       return (0);
+       return (-1);
 }
 
 /*
@@ -812,7 +805,7 @@ parserep(register const struct rpc_msg *rp, register u_int length)
         * which is an "enum" and so occupies one 32-bit word.
         */
        dp = ((const u_int32_t *)&rp->rm_reply) + 1;
-       TCHECK2(dp[0], 1);
+       TCHECK(dp[1]);
        len = ntohl(dp[1]);
        if (len >= length)
                return (NULL);
@@ -862,42 +855,31 @@ parserep(register const struct rpc_msg *rp, register u_int length)
                return (NULL);
        }
        /* successful return */
-       if ((sizeof(astat) + ((u_char *)dp)) < snapend)
-               return ((u_int32_t *) (sizeof(astat) + ((char *)dp)));
+       TCHECK2(*dp, sizeof(astat));
+       return ((u_int32_t *) (sizeof(astat) + ((char *)dp)));
 trunc:
        return (0);
 }
 
-#define T2CHECK(p, l) if ((u_char *)(p) > ((u_char *)snapend) - l) return(0)
-
-/*
- * Not all systems have strerror().
- */
-static const char *
-strerr(int errno)
-{
-       return (strerror(errno));
-}
-
 static const u_int32_t *
 parsestatus(const u_int32_t *dp, int *er)
 {
-       int errno;
-       T2CHECK(dp, 4);
+       int errnum;
+
+       TCHECK(dp[0]);
 
-       errno = ntohl(dp[0]);
+       errnum = ntohl(dp[0]);
        if (er)
-               *er = errno;
-       if (errno != 0 && !qflag) {
-               const char *errmsg;
-
-               errmsg = strerr(errno);
-               if (errmsg)
-                       printf(" ERROR: '%s'", errmsg);
-               else
-                       printf(" ERROR: %d", errno);
+               *er = errnum;
+       if (errnum != 0) {
+               if (!qflag)
+                       printf(" ERROR: %s", pcap_strerror(errnum));
+               nfserr = 1;
+               return (NULL);
        }
        return (dp + 1);
+trunc:
+       return NULL;
 }
 
 static const u_int32_t *
@@ -905,9 +887,8 @@ parsefattr(const u_int32_t *dp, int verbose, int v3)
 {
        const struct nfs_fattr *fap;
 
-       T2CHECK(dp,  5 * sizeof(*dp));
-
        fap = (const struct nfs_fattr *)dp;
+       TCHECK(fap->fa_gid);
        if (verbose) {
                printf(" %s %o ids %d/%d",
                    tok2str(type2str, "unk-ft %d ",
@@ -916,22 +897,21 @@ parsefattr(const u_int32_t *dp, int verbose, int v3)
                    (u_int32_t)ntohl(fap->fa_uid),
                    (u_int32_t) ntohl(fap->fa_gid));
                if (v3) {
-                       T2CHECK(dp,  7 * sizeof(*dp));
+                       TCHECK(fap->fa3_size);
                        printf(" sz ");
                        print_int64((u_int32_t *)&fap->fa3_size, UNSIGNED);
                        putchar(' ');
-       }
-               else {
-                       T2CHECK(dp,  6 * sizeof(*dp));
+               } else {
+                       TCHECK(fap->fa2_size);
                        printf(" sz %d ", (u_int32_t) ntohl(fap->fa2_size));
                }
        }
        /* print lots more stuff */
        if (verbose > 1) {
                if (v3) {
-                       T2CHECK(dp, 64);
+                       TCHECK(fap->fa3_ctime);
                        printf("nlink %d rdev %d/%d ",
-                   (u_int32_t)ntohl(fap->fa_nlink),
+                              (u_int32_t)ntohl(fap->fa_nlink),
                               (u_int32_t) ntohl(fap->fa3_rdev.specdata1),
                               (u_int32_t) ntohl(fap->fa3_rdev.specdata2));
                        printf("fsid ");
@@ -941,20 +921,20 @@ parsefattr(const u_int32_t *dp, int verbose, int v3)
                        printf(" a/m/ctime %u.%06u ",
                               (u_int32_t) ntohl(fap->fa3_atime.nfsv3_sec),
                               (u_int32_t) ntohl(fap->fa3_atime.nfsv3_nsec));
-               printf("%u.%06u ",
+                       printf("%u.%06u ",
                               (u_int32_t) ntohl(fap->fa3_mtime.nfsv3_sec),
                               (u_int32_t) ntohl(fap->fa3_mtime.nfsv3_nsec));
-               printf("%u.%06u ",
+                       printf("%u.%06u ",
                               (u_int32_t) ntohl(fap->fa3_ctime.nfsv3_sec),
                               (u_int32_t) ntohl(fap->fa3_ctime.nfsv3_nsec));
                } else {
-                       T2CHECK(dp, 48);
+                       TCHECK(fap->fa2_ctime);
                        printf("nlink %d rdev %x fsid %x nodeid %x a/m/ctime ",
                               (u_int32_t) ntohl(fap->fa_nlink),
                               (u_int32_t) ntohl(fap->fa2_rdev),
                               (u_int32_t) ntohl(fap->fa2_fsid),
                               (u_int32_t) ntohl(fap->fa2_fileid));
-               printf("%u.%06u ",
+                       printf("%u.%06u ",
                               (u_int32_t) ntohl(fap->fa2_atime.nfsv2_sec),
                               (u_int32_t) ntohl(fap->fa2_atime.nfsv2_usec));
                        printf("%u.%06u ",
@@ -963,10 +943,12 @@ parsefattr(const u_int32_t *dp, int verbose, int v3)
                        printf("%u.%06u ",
                               (u_int32_t) ntohl(fap->fa2_ctime.nfsv2_sec),
                               (u_int32_t) ntohl(fap->fa2_ctime.nfsv2_usec));
-       }
+               }
        }
        return ((const u_int32_t *)((unsigned char *)dp +
                (v3 ? NFSX_V3FATTR : NFSX_V2FATTR)));
+trunc:
+       return (NULL);
 }
 
 static int
@@ -1030,7 +1012,7 @@ parsestatfs(const u_int32_t *dp, int v3)
                        return (0);
        }
 
-       T2CHECK(dp, (v3 ? NFSX_V3STATFS : NFSX_V2STATFS));
+       TCHECK2(dp, (v3 ? NFSX_V3STATFS : NFSX_V2STATFS));
 
        sfsp = (const struct nfs_statfs *)dp;
 
@@ -1053,14 +1035,16 @@ parsestatfs(const u_int32_t *dp, int v3)
                }
        } else {
                printf(" tsize %d bsize %d blocks %d bfree %d bavail %d",
-                   (u_int32_t)ntohl(sfsp->sf_tsize),
-                   (u_int32_t)ntohl(sfsp->sf_bsize),
-                   (u_int32_t)ntohl(sfsp->sf_blocks),
-                   (u_int32_t)ntohl(sfsp->sf_bfree),
-                   (u_int32_t)ntohl(sfsp->sf_bavail));
+                       (u_int32_t)ntohl(sfsp->sf_tsize),
+                       (u_int32_t)ntohl(sfsp->sf_bsize),
+                       (u_int32_t)ntohl(sfsp->sf_blocks),
+                       (u_int32_t)ntohl(sfsp->sf_bfree),
+                       (u_int32_t)ntohl(sfsp->sf_bavail));
        }
 
        return (1);
+trunc:
+       return (0);
 }
 
 static int
@@ -1074,12 +1058,14 @@ parserddires(const u_int32_t *dp)
        if (qflag)
                return (1);
 
-       T2CHECK(dp, 12);
+       TCHECK(dp[2]);
        printf(" offset %x size %d ", ntohl(dp[0]), ntohl(dp[1]));
-               if (dp[2] != 0)
-                       printf(" eof");
+       if (dp[2] != 0)
+               printf(" eof");
 
        return (1);
+trunc:
+       return (0);
 }
 
 static const u_int32_t *
@@ -1098,17 +1084,19 @@ parse_wcc_attr(const u_int32_t *dp)
 static const u_int32_t *
 parse_pre_op_attr(const u_int32_t *dp, int verbose)
 {
-       T2CHECK(dp, 4);
+       TCHECK(dp[0]);
        if (!ntohl(dp[0]))
                return (dp + 1);
        dp++;
-       T2CHECK(dp, 24);
+       TCHECK2(dp, 24);
        if (verbose > 1) {
                return parse_wcc_attr(dp);
        } else {
                /* If not verbose enough, just skip over wcc_attr */
                return (dp + 6);
        }
+trunc:
+       return (NULL);
 }
 
 /*
@@ -1117,7 +1105,7 @@ parse_pre_op_attr(const u_int32_t *dp, int verbose)
 static const u_int32_t *
 parse_post_op_attr(const u_int32_t *dp, int verbose)
 {
-       T2CHECK(dp, 4);
+       TCHECK(dp[0]);
        if (!ntohl(dp[0]))
                return (dp + 1);
        dp++;
@@ -1125,6 +1113,8 @@ parse_post_op_attr(const u_int32_t *dp, int verbose)
                return parsefattr(dp, verbose, 1);
        } else
                return (dp + (NFSX_V3FATTR / sizeof (u_int32_t)));
+trunc:
+       return (NULL);
 }
 
 static const u_int32_t *
@@ -1150,7 +1140,7 @@ parsecreateopres(const u_int32_t *dp, int verbose)
        if (er)
                dp = parse_wcc_data(dp, verbose);
        else {
-               T2CHECK(dp, 4);
+               TCHECK(dp[0]);
                if (!ntohl(dp[0]))
                        return (dp + 1);
                dp++;
@@ -1166,6 +1156,8 @@ parsecreateopres(const u_int32_t *dp, int verbose)
                }
        }
        return (dp);
+trunc:
+       return (NULL);
 }
 
 static int
@@ -1192,12 +1184,14 @@ parsev3rddirres(const u_int32_t *dp, int verbose)
        if (er)
                return dp;
        if (vflag) {
-               T2CHECK(dp, 8);
+               TCHECK(dp[1]);
                printf(" verf %08x%08x", dp[0], dp[1]);
                dp += 2;
        }
        return dp;
-       }
+trunc:
+       return (NULL);
+}
 
 static int
 parsefsinfo(const u_int32_t *dp)
@@ -1212,11 +1206,10 @@ parsefsinfo(const u_int32_t *dp)
        if (!(dp = parse_post_op_attr(dp, vflag)))
                return (0);
        if (er)
-       return (1);
-
-       T2CHECK(dp, sizeof (struct nfsv3_fsinfo));
+               return (1);
 
        sfp = (struct nfsv3_fsinfo *)dp;
+       TCHECK(*sfp);
        printf(" rtmax %u rtpref %u wtmax %u wtpref %u dtpref %u",
               (u_int32_t) ntohl(sfp->fs_rtmax),
               (u_int32_t) ntohl(sfp->fs_rtpref),
@@ -1232,6 +1225,8 @@ parsefsinfo(const u_int32_t *dp)
                       (u_int32_t) ntohl(sfp->fs_timedelta.nfsv3_sec),
                       (u_int32_t) ntohl(sfp->fs_timedelta.nfsv3_nsec));
        }
+       return (0);
+trunc:
        return (1);
 }
 
@@ -1242,7 +1237,7 @@ parsepathconf(const u_int32_t *dp)
        struct nfsv3_pathconf *spp;
 
        if (!(dp = parsestatus(dp, &er)))
-       return (0);
+               return (0);
        if (vflag)
                printf(" POST:");
        if (!(dp = parse_post_op_attr(dp, vflag)))
@@ -1250,9 +1245,8 @@ parsepathconf(const u_int32_t *dp)
        if (er)
                return (1);
 
-       T2CHECK(dp, sizeof (struct nfsv3_pathconf));
-
        spp = (struct nfsv3_pathconf *)dp;
+       TCHECK(*spp);
 
        printf(" linkmax %u namemax %u %s %s %s %s",
               (u_int32_t) ntohl(spp->pc_linkmax),
@@ -1262,6 +1256,8 @@ parsepathconf(const u_int32_t *dp)
               ntohl(spp->pc_caseinsensitive) ? "igncase" : "",
               ntohl(spp->pc_casepreserving) ? "keepcase" : "");
        return (0);
+trunc:
+       return (1);
 }
 
 static void
@@ -1302,7 +1298,7 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
                                return;
                } else {
                        if (parseattrstat(dp, !qflag, 0) != 0)
-                       return;
+                               return;
                }
                break;
 
@@ -1331,7 +1327,7 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
                                return;
                } else {
                        if (parsediropres(dp) != 0)
-                       return;
+                               return;
                }
                break;
 
@@ -1367,7 +1363,7 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
                        if (er)
                                return;
                        if (vflag) {
-                               TCHECK2(dp[0], 8);
+                               TCHECK(dp[1]);
                                printf("%u bytes", (u_int32_t) ntohl(dp[0]));
                                if (ntohl(dp[1]))
                                        printf(" EOF");
@@ -1375,7 +1371,7 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
                        return;
                } else {
                        if (parseattrstat(dp, vflag, 0) != 0)
-                       return;
+                               return;
                }
                break;
 
@@ -1389,14 +1385,15 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
                        if (!(dp = parse_wcc_data(dp, vflag)))
                                break;
                        if (er)
-                       return;
+                               return;
                        if (vflag) {
-                               TCHECK2(dp[0], 4);
+                               TCHECK(dp[0]);
                                printf("%u bytes", (u_int32_t) ntohl(dp[0]));
                                if (vflag > 1) {
-                                       TCHECK2(dp[0], 4);
+                                       TCHECK(dp[1]);
                                        printf(" <%s>",
-                                              nfsv3_writemodes[ntohl(dp[1])]);
+                                               tok2str(nfsv3_writemodes,
+                                                       NULL, ntohl(dp[1])));
                                }
                                return;
                        }
@@ -1441,7 +1438,7 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
                                return;
                } else {
                        if (parsestatus(dp, &er) != 0)
-                       return;
+                               return;
                }
                break;
 
@@ -1475,7 +1472,7 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
                                return;
                } else {
                        if (parsestatus(dp, &er) != 0)
-                       return;
+                               return;
                }
                break;
 
@@ -1519,7 +1516,7 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
                        }
                } else {
                        if (parsestatus(dp, &er) != 0)
-                       return;
+                               return;
                }
                break;
 
@@ -1532,7 +1529,7 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
                                return;
                } else {
                        if (parserddires(dp) != 0)
-                       return;
+                               return;
                }
                break;
 
@@ -1576,7 +1573,7 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
                printf(" proc-%u", proc);
                return;
        }
+trunc:
        if (!nfserr)
                fputs(" [|nfs]", stdout);
-trunc:;
 }