]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-nfs.c
PGM: Add another test.
[tcpdump] / print-nfs.c
index c3158057b84b0f0985f767641178b1318d107455..e752a59cf4b9122df2a84ff677a411c84464aa57 100644 (file)
@@ -54,7 +54,7 @@ static const uint32_t *parse_post_op_attr(netdissect_options *, const uint32_t *
 /*
  * Mapping of old NFS Version 2 RPC numbers to generic numbers.
  */
-uint32_t nfsv3_procid[NFS_NPROCS] = {
+static uint32_t nfsv3_procid[NFS_NPROCS] = {
        NFSPROC_NULL,
        NFSPROC_GETATTR,
        NFSPROC_SETATTR,
@@ -628,17 +628,15 @@ nfsreq_print_noaddr(netdissect_options *ndo,
                if ((dp = parsereq(ndo, rp, length)) != NULL &&
                    (dp = parsefh(ndo, dp, v3)) != NULL) {
                        if (v3) {
-                               ND_TCHECK(dp[2]);
+                               ND_TCHECK(dp[4]);
                                ND_PRINT((ndo, " %u (%u) bytes @ %" PRIu64,
                                                EXTRACT_32BITS(&dp[4]),
                                                EXTRACT_32BITS(&dp[2]),
                                                EXTRACT_64BITS(&dp[0])));
                                if (ndo->ndo_vflag) {
-                                       dp += 3;
-                                       ND_TCHECK(dp[0]);
                                        ND_PRINT((ndo, " <%s>",
                                                tok2str(nfsv3_writemodes,
-                                                       NULL, EXTRACT_32BITS(dp))));
+                                                       NULL, EXTRACT_32BITS(&dp[3]))));
                                }
                        } else {
                                ND_TCHECK(dp[3]);
@@ -653,12 +651,12 @@ nfsreq_print_noaddr(netdissect_options *ndo,
                break;
 
        case NFSPROC_SYMLINK:
-               if ((dp = parsereq(ndo, rp, length)) != 0 &&
-                   (dp = parsefhn(ndo, dp, v3)) != 0) {
+               if ((dp = parsereq(ndo, rp, length)) != NULL &&
+                   (dp = parsefhn(ndo, dp, v3)) != NULL) {
                        ND_PRINT((ndo, " ->"));
-                       if (v3 && (dp = parse_sattr3(ndo, dp, &sa3)) == 0)
+                       if (v3 && (dp = parse_sattr3(ndo, dp, &sa3)) == NULL)
                                break;
-                       if (parsefn(ndo, dp) == 0)
+                       if (parsefn(ndo, dp) == NULL)
                                break;
                        if (v3 && ndo->ndo_vflag)
                                print_sattr3(ndo, &sa3, ndo->ndo_vflag);
@@ -667,12 +665,12 @@ nfsreq_print_noaddr(netdissect_options *ndo,
                break;
 
        case NFSPROC_MKNOD:
-               if ((dp = parsereq(ndo, rp, length)) != 0 &&
-                   (dp = parsefhn(ndo, dp, v3)) != 0) {
+               if ((dp = parsereq(ndo, rp, length)) != NULL &&
+                   (dp = parsefhn(ndo, dp, v3)) != NULL) {
                        ND_TCHECK(*dp);
                        type = (nfs_type)EXTRACT_32BITS(dp);
                        dp++;
-                       if ((dp = parse_sattr3(ndo, dp, &sa3)) == 0)
+                       if ((dp = parse_sattr3(ndo, dp, &sa3)) == NULL)
                                break;
                        ND_PRINT((ndo, " %s", tok2str(type2str, "unk-ft %d", type)));
                        if (ndo->ndo_vflag && (type == NFCHR || type == NFBLK)) {
@@ -809,11 +807,15 @@ nfs_printfh(netdissect_options *ndo,
 
        if (sfsname) {
                /* file system ID is ASCII, not numeric, for this server OS */
-               static char temp[NFSX_V3FHMAX+1];
+               char temp[NFSX_V3FHMAX+1];
+               u_int stringlen;
 
                /* Make sure string is null-terminated */
-               strncpy(temp, sfsname, NFSX_V3FHMAX);
-               temp[sizeof(temp) - 1] = '\0';
+               stringlen = len;
+               if (stringlen > NFSX_V3FHMAX)
+                       stringlen = NFSX_V3FHMAX;
+               strncpy(temp, sfsname, stringlen);
+               temp[stringlen] = '\0';
                /* Remove trailing spaces */
                spacep = strchr(temp, ' ');
                if (spacep)
@@ -855,10 +857,10 @@ struct xid_map_entry {
 
 #define        XIDMAPSIZE      64
 
-struct xid_map_entry xid_map[XIDMAPSIZE];
+static struct xid_map_entry xid_map[XIDMAPSIZE];
 
-int    xid_map_next = 0;
-int    xid_map_hint = 0;
+static int xid_map_next = 0;
+static int xid_map_hint = 0;
 
 static int
 xid_map_enter(netdissect_options *ndo,
@@ -868,7 +870,7 @@ xid_map_enter(netdissect_options *ndo,
        const struct ip6_hdr *ip6 = NULL;
        struct xid_map_entry *xmep;
 
-       if (!ND_TTEST(rp->rm_call.cb_vers))
+       if (!ND_TTEST(rp->rm_call.cb_proc))
                return (0);
        switch (IP_V((const struct ip *)bp)) {
        case 4:
@@ -1002,11 +1004,11 @@ parserep(netdissect_options *ndo,
         * skip past the ar_verf credentials.
         */
        dp += (len + (2*sizeof(uint32_t) + 3)) / sizeof(uint32_t);
-       ND_TCHECK2(dp[0], 0);
 
        /*
         * now we can check the ar_stat field
         */
+       ND_TCHECK(dp[0]);
        astat = (enum sunrpc_accept_stat) EXTRACT_32BITS(dp);
        if (astat != SUNRPC_SUCCESS) {
                ND_PRINT((ndo, " %s", tok2str(sunrpc_str, "ar_stat %d", astat)));
@@ -1243,6 +1245,7 @@ static const uint32_t *
 parse_wcc_attr(netdissect_options *ndo,
                const uint32_t *dp)
 {
+       /* Our caller has already checked this */
        ND_PRINT((ndo, " sz %" PRIu64, EXTRACT_64BITS(&dp[0])));
        ND_PRINT((ndo, " mtime %u.%06u ctime %u.%06u",
               EXTRACT_32BITS(&dp[2]), EXTRACT_32BITS(&dp[3]),
@@ -1344,7 +1347,7 @@ parsewccres(netdissect_options *ndo,
 
        if (!(dp = parsestatus(ndo, dp, &er)))
                return (0);
-       return parse_wcc_data(ndo, dp, verbose) != 0;
+       return parse_wcc_data(ndo, dp, verbose) != NULL;
 }
 
 static const uint32_t *
@@ -1511,8 +1514,10 @@ interp_reply(netdissect_options *ndo,
                        ND_PRINT((ndo, " attr:"));
                if (!(dp = parse_post_op_attr(ndo, dp, ndo->ndo_vflag)))
                        break;
-               if (!er)
+               if (!er) {
+                       ND_TCHECK(dp[0]);
                        ND_PRINT((ndo, " c %04x", EXTRACT_32BITS(&dp[0])));
+               }
                return;
 
        case NFSPROC_READLINK:
@@ -1576,7 +1581,7 @@ interp_reply(netdissect_options *ndo,
                if (!(dp = parserep(ndo, rp, length)))
                        break;
                if (v3) {
-                       if (parsecreateopres(ndo, dp, ndo->ndo_vflag) != 0)
+                       if (parsecreateopres(ndo, dp, ndo->ndo_vflag) != NULL)
                                return;
                } else {
                        if (parsediropres(ndo, dp) != 0)
@@ -1588,10 +1593,10 @@ interp_reply(netdissect_options *ndo,
                if (!(dp = parserep(ndo, rp, length)))
                        break;
                if (v3) {
-                       if (parsecreateopres(ndo, dp, ndo->ndo_vflag) != 0)
+                       if (parsecreateopres(ndo, dp, ndo->ndo_vflag) != NULL)
                                return;
                } else {
-                       if (parsestatus(ndo, dp, &er) != 0)
+                       if (parsestatus(ndo, dp, &er) != NULL)
                                return;
                }
                break;
@@ -1599,7 +1604,7 @@ interp_reply(netdissect_options *ndo,
        case NFSPROC_MKNOD:
                if (!(dp = parserep(ndo, rp, length)))
                        break;
-               if (parsecreateopres(ndo, dp, ndo->ndo_vflag) != 0)
+               if (parsecreateopres(ndo, dp, ndo->ndo_vflag) != NULL)
                        return;
                break;
 
@@ -1611,7 +1616,7 @@ interp_reply(netdissect_options *ndo,
                        if (parsewccres(ndo, dp, ndo->ndo_vflag))
                                return;
                } else {
-                       if (parsestatus(ndo, dp, &er) != 0)
+                       if (parsestatus(ndo, dp, &er) != NULL)
                                return;
                }
                break;
@@ -1632,7 +1637,7 @@ interp_reply(netdissect_options *ndo,
                        }
                        return;
                } else {
-                       if (parsestatus(ndo, dp, &er) != 0)
+                       if (parsestatus(ndo, dp, &er) != NULL)
                                return;
                }
                break;
@@ -1653,7 +1658,7 @@ interp_reply(netdissect_options *ndo,
                                return;
                        }
                } else {
-                       if (parsestatus(ndo, dp, &er) != 0)
+                       if (parsestatus(ndo, dp, &er) != NULL)
                                return;
                }
                break;