X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/2319e2892f510bda56d4ee34f6d5cdbdc31fc7f0..296d466cd6bbf2f7e75e15bb6a01268e88c76ed0:/print-nfs.c diff --git a/print-nfs.c b/print-nfs.c index 8600afbd..b67ec370 100644 --- a/print-nfs.c +++ b/print-nfs.c @@ -21,9 +21,7 @@ /* \summary: Network File System (NFS) printer */ -#ifdef HAVE_CONFIG_H #include -#endif #include "netdissect-stdinc.h" @@ -46,8 +44,7 @@ static void nfs_printfh(netdissect_options *, const uint32_t *, const u_int); static int xid_map_enter(netdissect_options *, const struct sunrpc_msg *, const u_char *); -static int xid_map_find(const struct sunrpc_msg *, const u_char *, - uint32_t *, uint32_t *); +static int xid_map_find(netdissect_options *, const struct sunrpc_msg *, const u_char *, uint32_t *, uint32_t *); static void interp_reply(netdissect_options *, const struct sunrpc_msg *, uint32_t, uint32_t, int); static const uint32_t *parse_post_op_attr(netdissect_options *, const uint32_t *, int); @@ -199,7 +196,7 @@ static const struct tok sunrpc_str[] = { }; static void -print_nfsaddr(netdissect_options *ndo, +nfsaddr_print(netdissect_options *ndo, const u_char *bp, const char *s, const char *d) { const struct ip *ip; @@ -210,14 +207,14 @@ print_nfsaddr(netdissect_options *ndo, switch (IP_V((const struct ip *)bp)) { case 4: ip = (const struct ip *)bp; - strlcpy(srcaddr, ipaddr_string(ndo, ip->ip_src), sizeof(srcaddr)); - strlcpy(dstaddr, ipaddr_string(ndo, ip->ip_dst), sizeof(dstaddr)); + strlcpy(srcaddr, GET_IPADDR_STRING(ip->ip_src), sizeof(srcaddr)); + strlcpy(dstaddr, GET_IPADDR_STRING(ip->ip_dst), sizeof(dstaddr)); break; case 6: ip6 = (const struct ip6_hdr *)bp; - strlcpy(srcaddr, ip6addr_string(ndo, ip6->ip6_src), + strlcpy(srcaddr, GET_IP6ADDR_STRING(ip6->ip6_src), sizeof(srcaddr)); - strlcpy(dstaddr, ip6addr_string(ndo, ip6->ip6_dst), + strlcpy(dstaddr, GET_IP6ADDR_STRING(ip6->ip6_dst), sizeof(dstaddr)); break; default: @@ -261,67 +258,53 @@ static const uint32_t * parse_sattr3(netdissect_options *ndo, const uint32_t *dp, struct nfsv3_sattr *sa3) { - ND_TCHECK_4(dp); - sa3->sa_modeset = EXTRACT_BE_U_4(dp); + sa3->sa_modeset = GET_BE_U_4(dp); dp++; if (sa3->sa_modeset) { - ND_TCHECK_4(dp); - sa3->sa_mode = EXTRACT_BE_U_4(dp); + sa3->sa_mode = GET_BE_U_4(dp); dp++; } - ND_TCHECK_4(dp); - sa3->sa_uidset = EXTRACT_BE_U_4(dp); + sa3->sa_uidset = GET_BE_U_4(dp); dp++; if (sa3->sa_uidset) { - ND_TCHECK_4(dp); - sa3->sa_uid = EXTRACT_BE_U_4(dp); + sa3->sa_uid = GET_BE_U_4(dp); dp++; } - ND_TCHECK_4(dp); - sa3->sa_gidset = EXTRACT_BE_U_4(dp); + sa3->sa_gidset = GET_BE_U_4(dp); dp++; if (sa3->sa_gidset) { - ND_TCHECK_4(dp); - sa3->sa_gid = EXTRACT_BE_U_4(dp); + sa3->sa_gid = GET_BE_U_4(dp); dp++; } - ND_TCHECK_4(dp); - sa3->sa_sizeset = EXTRACT_BE_U_4(dp); + sa3->sa_sizeset = GET_BE_U_4(dp); dp++; if (sa3->sa_sizeset) { - ND_TCHECK_4(dp); - sa3->sa_size = EXTRACT_BE_U_4(dp); + sa3->sa_size = GET_BE_U_4(dp); dp++; } - ND_TCHECK_4(dp); - sa3->sa_atimetype = EXTRACT_BE_U_4(dp); + sa3->sa_atimetype = GET_BE_U_4(dp); dp++; if (sa3->sa_atimetype == NFSV3SATTRTIME_TOCLIENT) { - ND_TCHECK_4(dp + 1); - sa3->sa_atime.nfsv3_sec = EXTRACT_BE_U_4(dp); + sa3->sa_atime.nfsv3_sec = GET_BE_U_4(dp); dp++; - sa3->sa_atime.nfsv3_nsec = EXTRACT_BE_U_4(dp); + sa3->sa_atime.nfsv3_nsec = GET_BE_U_4(dp); dp++; } - ND_TCHECK_4(dp); - sa3->sa_mtimetype = EXTRACT_BE_U_4(dp); + sa3->sa_mtimetype = GET_BE_U_4(dp); dp++; if (sa3->sa_mtimetype == NFSV3SATTRTIME_TOCLIENT) { - ND_TCHECK_4(dp + 1); - sa3->sa_mtime.nfsv3_sec = EXTRACT_BE_U_4(dp); + sa3->sa_mtime.nfsv3_sec = GET_BE_U_4(dp); dp++; - sa3->sa_mtime.nfsv3_nsec = EXTRACT_BE_U_4(dp); + sa3->sa_mtime.nfsv3_nsec = GET_BE_U_4(dp); dp++; } return dp; -trunc: - return NULL; } static void @@ -355,23 +338,18 @@ nfsreply_print(netdissect_options *ndo, ndo->ndo_protocol = "nfs"; rp = (const struct sunrpc_msg *)bp; - ND_TCHECK_4(rp->rm_xid); if (!ndo->ndo_nflag) { strlcpy(srcid, "nfs", sizeof(srcid)); - nd_snprintf(dstid, sizeof(dstid), "%u", - EXTRACT_BE_U_4(rp->rm_xid)); + snprintf(dstid, sizeof(dstid), "%u", + GET_BE_U_4(rp->rm_xid)); } else { - nd_snprintf(srcid, sizeof(srcid), "%u", NFS_PORT); - nd_snprintf(dstid, sizeof(dstid), "%u", - EXTRACT_BE_U_4(rp->rm_xid)); + snprintf(srcid, sizeof(srcid), "%u", NFS_PORT); + snprintf(dstid, sizeof(dstid), "%u", + GET_BE_U_4(rp->rm_xid)); } - print_nfsaddr(ndo, bp2, srcid, dstid); + nfsaddr_print(ndo, bp2, srcid, dstid); nfsreply_noaddr_print(ndo, bp, length, bp2); - return; - -trunc: - nd_print_trunc(ndo); } void @@ -390,31 +368,31 @@ nfsreply_noaddr_print(netdissect_options *ndo, rp = (const struct sunrpc_msg *)bp; ND_TCHECK_4(rp->rm_reply.rp_stat); - reply_stat = EXTRACT_BE_U_4(&rp->rm_reply.rp_stat); + reply_stat = GET_BE_U_4(&rp->rm_reply.rp_stat); switch (reply_stat) { case SUNRPC_MSG_ACCEPTED: ND_PRINT("reply ok %u", length); - if (xid_map_find(rp, bp2, &proc, &vers) >= 0) + if (xid_map_find(ndo, rp, bp2, &proc, &vers) >= 0) interp_reply(ndo, rp, proc, vers, length); break; case SUNRPC_MSG_DENIED: ND_PRINT("reply ERR %u: ", length); ND_TCHECK_4(rp->rm_reply.rp_reject.rj_stat); - rstat = EXTRACT_BE_U_4(&rp->rm_reply.rp_reject.rj_stat); + rstat = GET_BE_U_4(&rp->rm_reply.rp_reject.rj_stat); switch (rstat) { case SUNRPC_RPC_MISMATCH: ND_TCHECK_4(rp->rm_reply.rp_reject.rj_vers.high); - rlow = EXTRACT_BE_U_4(&rp->rm_reply.rp_reject.rj_vers.low); - rhigh = EXTRACT_BE_U_4(&rp->rm_reply.rp_reject.rj_vers.high); + rlow = GET_BE_U_4(&rp->rm_reply.rp_reject.rj_vers.low); + rhigh = GET_BE_U_4(&rp->rm_reply.rp_reject.rj_vers.high); ND_PRINT("RPC Version mismatch (%u-%u)", rlow, rhigh); break; case SUNRPC_AUTH_ERROR: ND_TCHECK_4(rp->rm_reply.rp_reject.rj_why); - rwhy = EXTRACT_BE_U_4(&rp->rm_reply.rp_reject.rj_why); + rwhy = GET_BE_U_4(&rp->rm_reply.rp_reject.rj_why); ND_PRINT("Auth %s", tok2str(sunrpc_auth_str, "Invalid failure code %u", rwhy)); break; @@ -453,8 +431,12 @@ parsereq(netdissect_options *ndo, dp = (const uint32_t *)&rp->rm_call.cb_cred; if (length < 2 * sizeof(*dp)) goto trunc; - ND_TCHECK_4(dp + 1); - len = EXTRACT_BE_U_4(dp + 1); + len = GET_BE_U_4(dp + 1); + if (len > length) { + ND_PRINT(" [credentials length %u > %u]", len, length); + nd_print_invalid(ndo); + return NULL; + } rounded_len = roundup2(len, 4); ND_TCHECK_LEN(dp + 2, rounded_len); if (2 * sizeof(*dp) + rounded_len <= length) { @@ -473,8 +455,12 @@ parsereq(netdissect_options *ndo, */ if (length < 2 * sizeof(*dp)) goto trunc; - ND_TCHECK_4(dp + 1); - len = EXTRACT_BE_U_4(dp + 1); + len = GET_BE_U_4(dp + 1); + if (len > length) { + ND_PRINT(" [verifier length %u > %u]", len, length); + nd_print_invalid(ndo); + return NULL; + } rounded_len = roundup2(len, 4); ND_TCHECK_LEN(dp + 2, rounded_len); if (2 * sizeof(*dp) + rounded_len < length) { @@ -503,8 +489,7 @@ parsefh(netdissect_options *ndo, u_int len; if (v3) { - ND_TCHECK_4(dp); - len = EXTRACT_BE_U_4(dp) / 4; + len = GET_BE_U_4(dp) / 4; dp++; } else len = NFSX_V2FH / 4; @@ -512,9 +497,8 @@ parsefh(netdissect_options *ndo, if (ND_TTEST_LEN(dp, len * sizeof(*dp))) { nfs_printfh(ndo, dp, len); return (dp + len); - } -trunc: - return (NULL); + } else + return NULL; } /* @@ -525,14 +509,11 @@ static const uint32_t * parsefn(netdissect_options *ndo, const uint32_t *dp) { - uint32_t len; + uint32_t len, rounded_len; const u_char *cp; - /* Bail if we don't have the string length */ - ND_TCHECK_4(dp); - /* Fetch big-endian string length */ - len = EXTRACT_BE_U_4(dp); + len = GET_BE_U_4(dp); dp++; if (UINT_MAX - len < 3) { @@ -541,11 +522,12 @@ parsefn(netdissect_options *ndo, return NULL; } - ND_TCHECK_LEN(dp, ((len + 3) & ~3)); + rounded_len = roundup2(len, 4); + ND_TCHECK_LEN(dp, rounded_len); cp = (const u_char *)dp; /* Update 32-bit pointer (NFS filenames padded to 32-bit boundaries) */ - dp += ((len + 3) & ~3) / sizeof(*dp); + dp += rounded_len / sizeof(*dp); ND_PRINT("\""); if (nd_printn(ndo, cp, len, ndo->ndo_snapend)) { ND_PRINT("\""); @@ -594,8 +576,8 @@ nfsreq_noaddr_print(netdissect_options *ndo, if (!xid_map_enter(ndo, rp, bp2)) /* record proc number for later on */ goto trunc; - v3 = (EXTRACT_BE_U_4(&rp->rm_call.cb_vers) == NFS_VER3); - proc = EXTRACT_BE_U_4(&rp->rm_call.cb_proc); + v3 = (GET_BE_U_4(&rp->rm_call.cb_vers) == NFS_VER3); + proc = GET_BE_U_4(&rp->rm_call.cb_proc); if (!v3 && proc < NFS_NPROCS) proc = nfsv3_procid[proc]; @@ -635,8 +617,7 @@ nfsreq_noaddr_print(netdissect_options *ndo, dp = parsefh(ndo, dp, v3); if (dp == NULL) goto trunc; - ND_TCHECK_4(dp); - access_flags = EXTRACT_BE_U_4(dp); + access_flags = GET_BE_U_4(dp); if (access_flags & ~NFSV3ACCESS_FULL) { /* NFSV3ACCESS definitions aren't up to date */ ND_PRINT(" %04x", access_flags); @@ -677,15 +658,13 @@ nfsreq_noaddr_print(netdissect_options *ndo, if (dp == NULL) goto trunc; if (v3) { - ND_TCHECK_4(dp + 2); ND_PRINT(" %u bytes @ %" PRIu64, - EXTRACT_BE_U_4(dp + 2), - EXTRACT_BE_U_8(dp)); + GET_BE_U_4(dp + 2), + GET_BE_U_8(dp)); } else { - ND_TCHECK_4(dp + 1); ND_PRINT(" %u bytes @ %u", - EXTRACT_BE_U_4(dp + 1), - EXTRACT_BE_U_4(dp)); + GET_BE_U_4(dp + 1), + GET_BE_U_4(dp)); } break; @@ -697,23 +676,21 @@ nfsreq_noaddr_print(netdissect_options *ndo, if (dp == NULL) goto trunc; if (v3) { - ND_TCHECK_4(dp + 4); ND_PRINT(" %u (%u) bytes @ %" PRIu64, - EXTRACT_BE_U_4(dp + 4), - EXTRACT_BE_U_4(dp + 2), - EXTRACT_BE_U_8(dp)); + GET_BE_U_4(dp + 4), + GET_BE_U_4(dp + 2), + GET_BE_U_8(dp)); if (ndo->ndo_vflag) { ND_PRINT(" <%s>", tok2str(nfsv3_writemodes, - NULL, EXTRACT_BE_U_4(dp + 3))); + NULL, GET_BE_U_4(dp + 3))); } } else { - ND_TCHECK_4(dp + 3); ND_PRINT(" %u (%u) bytes @ %u (%u)", - EXTRACT_BE_U_4(dp + 3), - EXTRACT_BE_U_4(dp + 2), - EXTRACT_BE_U_4(dp + 1), - EXTRACT_BE_U_4(dp)); + GET_BE_U_4(dp + 3), + GET_BE_U_4(dp + 2), + GET_BE_U_4(dp + 1), + GET_BE_U_4(dp)); } break; @@ -740,18 +717,16 @@ nfsreq_noaddr_print(netdissect_options *ndo, dp = parsefhn(ndo, dp, v3); if (dp == NULL) goto trunc; - ND_TCHECK_4(dp); - type = (nfs_type) EXTRACT_BE_U_4(dp); + type = (nfs_type) GET_BE_U_4(dp); dp++; dp = parse_sattr3(ndo, dp, &sa3); if (dp == NULL) goto trunc; ND_PRINT(" %s", tok2str(type2str, "unk-ft %u", type)); if (ndo->ndo_vflag && (type == NFCHR || type == NFBLK)) { - ND_TCHECK_4(dp + 1); ND_PRINT(" %u/%u", - EXTRACT_BE_U_4(dp), - EXTRACT_BE_U_4(dp + 1)); + GET_BE_U_4(dp), + GET_BE_U_4(dp + 1)); dp += 2; } if (ndo->ndo_vflag) @@ -790,14 +765,13 @@ nfsreq_noaddr_print(netdissect_options *ndo, if (dp == NULL) goto trunc; if (v3) { - ND_TCHECK_4(dp + 4); /* * We shouldn't really try to interpret the * offset cookie here. */ ND_PRINT(" %u bytes @ %" PRId64, - EXTRACT_BE_U_4(dp + 4), - EXTRACT_BE_U_8(dp)); + GET_BE_U_4(dp + 4), + GET_BE_U_8(dp)); if (ndo->ndo_vflag) { /* * This displays the 8 bytes @@ -806,18 +780,17 @@ nfsreq_noaddr_print(netdissect_options *ndo, * to the high-order byte. */ ND_PRINT(" verf %08x%08x", - EXTRACT_BE_U_4(dp + 2), - EXTRACT_BE_U_4(dp + 3)); + GET_BE_U_4(dp + 2), + GET_BE_U_4(dp + 3)); } } else { - ND_TCHECK_4(dp + 1); /* * Print the offset as signed, since -1 is * common, but offsets > 2^31 aren't. */ ND_PRINT(" %u bytes @ %u", - EXTRACT_BE_U_4(dp + 1), - EXTRACT_BE_U_4(dp)); + GET_BE_U_4(dp + 1), + GET_BE_U_4(dp)); } break; @@ -828,16 +801,14 @@ nfsreq_noaddr_print(netdissect_options *ndo, dp = parsefh(ndo, dp, v3); if (dp == NULL) goto trunc; - ND_TCHECK_4(dp + 4); /* * We don't try to interpret the offset * cookie here. */ ND_PRINT(" %u bytes @ %" PRId64, - EXTRACT_BE_U_4(dp + 4), - EXTRACT_BE_U_8(dp)); + GET_BE_U_4(dp + 4), + GET_BE_U_8(dp)); if (ndo->ndo_vflag) { - ND_TCHECK_4(dp + 5); /* * This displays the 8 bytes * of the verifier in order, @@ -845,9 +816,9 @@ nfsreq_noaddr_print(netdissect_options *ndo, * to the high-order byte. */ ND_PRINT(" max %u verf %08x%08x", - EXTRACT_BE_U_4(dp + 5), - EXTRACT_BE_U_4(dp + 2), - EXTRACT_BE_U_4(dp + 3)); + GET_BE_U_4(dp + 5), + GET_BE_U_4(dp + 2), + GET_BE_U_4(dp + 3)); } break; @@ -858,10 +829,9 @@ nfsreq_noaddr_print(netdissect_options *ndo, dp = parsefh(ndo, dp, v3); if (dp == NULL) goto trunc; - ND_TCHECK_4(dp + 2); ND_PRINT(" %u bytes @ %" PRIu64, - EXTRACT_BE_U_4(dp + 2), - EXTRACT_BE_U_8(dp)); + GET_BE_U_4(dp + 2), + GET_BE_U_8(dp)); break; default: @@ -909,14 +879,14 @@ nfs_printfh(netdissect_options *ndo, * running tcpdump may show the same file * handle in different ways. */ - ND_PRINT("%s%x", sep, EXTRACT_BE_U_4(dp + i)); + ND_PRINT("%s%x", sep, GET_BE_U_4(dp + i)); sep = ":"; } ND_PRINT("]"); return; } - Parse_fh((const u_char *)dp, len, &fsid, &ino, NULL, &sfsname, 0); + Parse_fh(ndo, (const u_char *)dp, len, &fsid, &ino, NULL, &sfsname, 0); if (sfsname) { /* file system ID is ASCII, not numeric, for this server OS */ @@ -934,17 +904,19 @@ nfs_printfh(netdissect_options *ndo, if (spacep) *spacep = '\0'; - ND_PRINT(" fh %s/", temp); + ND_PRINT(" fh "); + fn_print_str(ndo, (const u_char *)temp); + ND_PRINT("/"); } else { ND_PRINT(" fh %u,%u/", fsid.Fsid_dev.Major, fsid.Fsid_dev.Minor); } - if(fsid.Fsid_dev.Minor == 257) + if(fsid.Fsid_dev.Minor == UINT_MAX && fsid.Fsid_dev.Major == UINT_MAX) /* Print the undecoded handle */ - ND_PRINT("%s", fsid.Opaque_Handle); + fn_print_str(ndo, (const u_char *)fsid.Opaque_Handle); else - ND_PRINT("%ld", (long) ino); + ND_PRINT("%u", ino); } /* @@ -956,8 +928,8 @@ nfs_printfh(netdissect_options *ndo, struct xid_map_entry { uint32_t xid; /* transaction ID (net order) */ int ipver; /* IP version (4 or 6) */ - struct in6_addr client; /* client IP address (net order) */ - struct in6_addr server; /* server IP address (net order) */ + nd_ipv6 client; /* client IP address (net order) */ + nd_ipv6 server; /* server IP address (net order) */ uint32_t proc; /* call proc number (host order) */ uint32_t vers; /* program version (host order) */ }; @@ -1008,16 +980,15 @@ xid_map_enter(netdissect_options *ndo, sizeof(ip->ip_src)); UNALIGNED_MEMCPY(&xmep->server, ip->ip_dst, sizeof(ip->ip_dst)); - } - else if (ip6) { + } else if (ip6) { xmep->ipver = 6; UNALIGNED_MEMCPY(&xmep->client, ip6->ip6_src, sizeof(ip6->ip6_src)); UNALIGNED_MEMCPY(&xmep->server, ip6->ip6_dst, sizeof(ip6->ip6_dst)); } - xmep->proc = EXTRACT_BE_U_4(&rp->rm_call.cb_proc); - xmep->vers = EXTRACT_BE_U_4(&rp->rm_call.cb_vers); + xmep->proc = GET_BE_U_4(&rp->rm_call.cb_proc); + xmep->vers = GET_BE_U_4(&rp->rm_call.cb_vers); return (1); } @@ -1026,8 +997,8 @@ xid_map_enter(netdissect_options *ndo, * version in vers return, or returns -1 on failure */ static int -xid_map_find(const struct sunrpc_msg *rp, const u_char *bp, uint32_t *proc, - uint32_t *vers) +xid_map_find(netdissect_options *ndo, const struct sunrpc_msg *rp, + const u_char *bp, uint32_t *proc, uint32_t *vers) { int i; struct xid_map_entry *xmep; @@ -1113,8 +1084,7 @@ parserep(netdissect_options *ndo, * which is an "enum" and so occupies one 32-bit word. */ dp = ((const uint32_t *)&rp->rm_reply) + 1; - ND_TCHECK_4(dp + 1); - len = EXTRACT_BE_U_4(dp + 1); + len = GET_BE_U_4(dp + 1); if (len >= length) return (NULL); /* @@ -1125,8 +1095,7 @@ parserep(netdissect_options *ndo, /* * now we can check the ar_stat field */ - ND_TCHECK_4(dp); - astat = (enum sunrpc_accept_stat) EXTRACT_BE_U_4(dp); + astat = (enum sunrpc_accept_stat) GET_BE_U_4(dp); if (astat != SUNRPC_SUCCESS) { ND_PRINT(" %s", tok2str(sunrpc_str, "ar_stat %u", astat)); *nfserrp = 1; /* suppress trunc string */ @@ -1145,9 +1114,7 @@ parsestatus(netdissect_options *ndo, { u_int errnum; - ND_TCHECK_4(dp); - - errnum = EXTRACT_BE_U_4(dp); + errnum = GET_BE_U_4(dp); if (er) *er = errnum; if (errnum != 0) { @@ -1157,8 +1124,6 @@ parsestatus(netdissect_options *ndo, *nfserrp = 1; } return (dp + 1); -trunc: - return NULL; } static const uint32_t * @@ -1178,17 +1143,15 @@ parsefattr(netdissect_options *ndo, */ ND_PRINT(" %s %o ids %d/%d", tok2str(type2str, "unk-ft %u ", - EXTRACT_BE_U_4(fap->fa_type)), - EXTRACT_BE_U_4(fap->fa_mode), - EXTRACT_BE_S_4(fap->fa_uid), - EXTRACT_BE_S_4(fap->fa_gid)); + GET_BE_U_4(fap->fa_type)), + GET_BE_U_4(fap->fa_mode), + GET_BE_S_4(fap->fa_uid), + GET_BE_S_4(fap->fa_gid)); if (v3) { - ND_TCHECK_8(fap->fa3_size); ND_PRINT(" sz %" PRIu64, - EXTRACT_BE_U_8(fap->fa3_size)); + GET_BE_U_8(fap->fa3_size)); } else { - ND_TCHECK_4(fap->fa2_size); - ND_PRINT(" sz %u", EXTRACT_BE_U_4(fap->fa2_size)); + ND_PRINT(" sz %u", GET_BE_U_4(fap->fa2_size)); } } /* print lots more stuff */ @@ -1196,38 +1159,38 @@ parsefattr(netdissect_options *ndo, if (v3) { ND_TCHECK_8(&fap->fa3_ctime); ND_PRINT(" nlink %u rdev %u/%u", - EXTRACT_BE_U_4(fap->fa_nlink), - EXTRACT_BE_U_4(fap->fa3_rdev.specdata1), - EXTRACT_BE_U_4(fap->fa3_rdev.specdata2)); + GET_BE_U_4(fap->fa_nlink), + GET_BE_U_4(fap->fa3_rdev.specdata1), + GET_BE_U_4(fap->fa3_rdev.specdata2)); ND_PRINT(" fsid %" PRIx64, - EXTRACT_BE_U_8(fap->fa3_fsid)); + GET_BE_U_8(fap->fa3_fsid)); ND_PRINT(" fileid %" PRIx64, - EXTRACT_BE_U_8(fap->fa3_fileid)); + GET_BE_U_8(fap->fa3_fileid)); ND_PRINT(" a/m/ctime %u.%06u", - EXTRACT_BE_U_4(fap->fa3_atime.nfsv3_sec), - EXTRACT_BE_U_4(fap->fa3_atime.nfsv3_nsec)); + GET_BE_U_4(fap->fa3_atime.nfsv3_sec), + GET_BE_U_4(fap->fa3_atime.nfsv3_nsec)); ND_PRINT(" %u.%06u", - EXTRACT_BE_U_4(fap->fa3_mtime.nfsv3_sec), - EXTRACT_BE_U_4(fap->fa3_mtime.nfsv3_nsec)); + GET_BE_U_4(fap->fa3_mtime.nfsv3_sec), + GET_BE_U_4(fap->fa3_mtime.nfsv3_nsec)); ND_PRINT(" %u.%06u", - EXTRACT_BE_U_4(fap->fa3_ctime.nfsv3_sec), - EXTRACT_BE_U_4(fap->fa3_ctime.nfsv3_nsec)); + GET_BE_U_4(fap->fa3_ctime.nfsv3_sec), + GET_BE_U_4(fap->fa3_ctime.nfsv3_nsec)); } else { ND_TCHECK_8(&fap->fa2_ctime); ND_PRINT(" nlink %u rdev 0x%x fsid 0x%x nodeid 0x%x a/m/ctime", - EXTRACT_BE_U_4(fap->fa_nlink), - EXTRACT_BE_U_4(fap->fa2_rdev), - EXTRACT_BE_U_4(fap->fa2_fsid), - EXTRACT_BE_U_4(fap->fa2_fileid)); + GET_BE_U_4(fap->fa_nlink), + GET_BE_U_4(fap->fa2_rdev), + GET_BE_U_4(fap->fa2_fsid), + GET_BE_U_4(fap->fa2_fileid)); ND_PRINT(" %u.%06u", - EXTRACT_BE_U_4(fap->fa2_atime.nfsv2_sec), - EXTRACT_BE_U_4(fap->fa2_atime.nfsv2_usec)); + GET_BE_U_4(fap->fa2_atime.nfsv2_sec), + GET_BE_U_4(fap->fa2_atime.nfsv2_usec)); ND_PRINT(" %u.%06u", - EXTRACT_BE_U_4(fap->fa2_mtime.nfsv2_sec), - EXTRACT_BE_U_4(fap->fa2_mtime.nfsv2_usec)); + GET_BE_U_4(fap->fa2_mtime.nfsv2_sec), + GET_BE_U_4(fap->fa2_mtime.nfsv2_usec)); ND_PRINT(" %u.%06u", - EXTRACT_BE_U_4(fap->fa2_ctime.nfsv2_sec), - EXTRACT_BE_U_4(fap->fa2_ctime.nfsv2_usec)); + GET_BE_U_4(fap->fa2_ctime.nfsv2_sec), + GET_BE_U_4(fap->fa2_ctime.nfsv2_usec)); } } return ((const uint32_t *)((const unsigned char *)dp + @@ -1320,23 +1283,23 @@ parsestatfs(netdissect_options *ndo, if (v3) { ND_PRINT(" tbytes %" PRIu64 " fbytes %" PRIu64 " abytes %" PRIu64, - EXTRACT_BE_U_8(sfsp->sf_tbytes), - EXTRACT_BE_U_8(sfsp->sf_fbytes), - EXTRACT_BE_U_8(sfsp->sf_abytes)); + GET_BE_U_8(sfsp->sf_tbytes), + GET_BE_U_8(sfsp->sf_fbytes), + GET_BE_U_8(sfsp->sf_abytes)); if (ndo->ndo_vflag) { ND_PRINT(" tfiles %" PRIu64 " ffiles %" PRIu64 " afiles %" PRIu64 " invar %u", - EXTRACT_BE_U_8(sfsp->sf_tfiles), - EXTRACT_BE_U_8(sfsp->sf_ffiles), - EXTRACT_BE_U_8(sfsp->sf_afiles), - EXTRACT_BE_U_4(sfsp->sf_invarsec)); + GET_BE_U_8(sfsp->sf_tfiles), + GET_BE_U_8(sfsp->sf_ffiles), + GET_BE_U_8(sfsp->sf_afiles), + GET_BE_U_4(sfsp->sf_invarsec)); } } else { ND_PRINT(" tsize %u bsize %u blocks %u bfree %u bavail %u", - EXTRACT_BE_U_4(sfsp->sf_tsize), - EXTRACT_BE_U_4(sfsp->sf_bsize), - EXTRACT_BE_U_4(sfsp->sf_blocks), - EXTRACT_BE_U_4(sfsp->sf_bfree), - EXTRACT_BE_U_4(sfsp->sf_bavail)); + GET_BE_U_4(sfsp->sf_tsize), + GET_BE_U_4(sfsp->sf_bsize), + GET_BE_U_4(sfsp->sf_blocks), + GET_BE_U_4(sfsp->sf_bfree), + GET_BE_U_4(sfsp->sf_bavail)); } return (1); @@ -1358,15 +1321,12 @@ parserddires(netdissect_options *ndo, if (ndo->ndo_qflag) return (1); - ND_TCHECK_4(dp + 2); ND_PRINT(" offset 0x%x size %u ", - EXTRACT_BE_U_4(dp), EXTRACT_BE_U_4(dp + 1)); - if (EXTRACT_BE_U_4(dp + 2) != 0) + GET_BE_U_4(dp), GET_BE_U_4(dp + 1)); + if (GET_BE_U_4(dp + 2) != 0) ND_PRINT(" eof"); return (1); -trunc: - return (0); } static const uint32_t * @@ -1374,10 +1334,10 @@ parse_wcc_attr(netdissect_options *ndo, const uint32_t *dp) { /* Our caller has already checked this */ - ND_PRINT(" sz %" PRIu64, EXTRACT_BE_U_8(dp)); + ND_PRINT(" sz %" PRIu64, GET_BE_U_8(dp)); ND_PRINT(" mtime %u.%06u ctime %u.%06u", - EXTRACT_BE_U_4(dp + 2), EXTRACT_BE_U_4(dp + 3), - EXTRACT_BE_U_4(dp + 4), EXTRACT_BE_U_4(dp + 5)); + GET_BE_U_4(dp + 2), GET_BE_U_4(dp + 3), + GET_BE_U_4(dp + 4), GET_BE_U_4(dp + 5)); return (dp + 6); } @@ -1388,8 +1348,7 @@ static const uint32_t * parse_pre_op_attr(netdissect_options *ndo, const uint32_t *dp, int verbose) { - ND_TCHECK_4(dp); - if (!EXTRACT_BE_U_4(dp)) + if (!GET_BE_U_4(dp)) return (dp + 1); dp++; ND_TCHECK_LEN(dp, 24); @@ -1410,16 +1369,13 @@ static const uint32_t * parse_post_op_attr(netdissect_options *ndo, const uint32_t *dp, int verbose) { - ND_TCHECK_4(dp); - if (!EXTRACT_BE_U_4(dp)) + if (!GET_BE_U_4(dp)) return (dp + 1); dp++; if (verbose) { return parsefattr(ndo, dp, verbose, 1); } else return (dp + (NFSX_V3FATTR / sizeof (uint32_t))); -trunc: - return (NULL); } static const uint32_t * @@ -1449,8 +1405,7 @@ parsecreateopres(netdissect_options *ndo, if (er) dp = parse_wcc_data(ndo, dp, verbose); else { - ND_TCHECK_4(dp); - if (!EXTRACT_BE_U_4(dp)) + if (!GET_BE_U_4(dp)) return (dp + 1); dp++; dp = parsefh(ndo, dp, 1); @@ -1467,8 +1422,6 @@ parsecreateopres(netdissect_options *ndo, } } return (dp); -trunc: - return (NULL); } static const uint32_t * @@ -1500,18 +1453,15 @@ parsev3rddirres(netdissect_options *ndo, if (er) return dp; if (ndo->ndo_vflag) { - ND_TCHECK_4(dp + 1); /* * This displays the 8 bytes of the verifier in order, * from the low-order byte to the high-order byte. */ ND_PRINT(" verf %08x%08x", - EXTRACT_BE_U_4(dp), EXTRACT_BE_U_4(dp + 1)); + GET_BE_U_4(dp), GET_BE_U_4(dp + 1)); dp += 2; } return dp; -trunc: - return (NULL); } static int @@ -1535,19 +1485,19 @@ parsefsinfo(netdissect_options *ndo, sfp = (const struct nfsv3_fsinfo *)dp; ND_TCHECK_SIZE(sfp); ND_PRINT(" rtmax %u rtpref %u wtmax %u wtpref %u dtpref %u", - EXTRACT_BE_U_4(sfp->fs_rtmax), - EXTRACT_BE_U_4(sfp->fs_rtpref), - EXTRACT_BE_U_4(sfp->fs_wtmax), - EXTRACT_BE_U_4(sfp->fs_wtpref), - EXTRACT_BE_U_4(sfp->fs_dtpref)); + GET_BE_U_4(sfp->fs_rtmax), + GET_BE_U_4(sfp->fs_rtpref), + GET_BE_U_4(sfp->fs_wtmax), + GET_BE_U_4(sfp->fs_wtpref), + GET_BE_U_4(sfp->fs_dtpref)); if (ndo->ndo_vflag) { ND_PRINT(" rtmult %u wtmult %u maxfsz %" PRIu64, - EXTRACT_BE_U_4(sfp->fs_rtmult), - EXTRACT_BE_U_4(sfp->fs_wtmult), - EXTRACT_BE_U_8(sfp->fs_maxfilesize)); + GET_BE_U_4(sfp->fs_rtmult), + GET_BE_U_4(sfp->fs_wtmult), + GET_BE_U_8(sfp->fs_maxfilesize)); ND_PRINT(" delta %u.%06u ", - EXTRACT_BE_U_4(sfp->fs_timedelta.nfsv3_sec), - EXTRACT_BE_U_4(sfp->fs_timedelta.nfsv3_nsec)); + GET_BE_U_4(sfp->fs_timedelta.nfsv3_sec), + GET_BE_U_4(sfp->fs_timedelta.nfsv3_nsec)); } return (1); trunc: @@ -1576,12 +1526,12 @@ parsepathconf(netdissect_options *ndo, ND_TCHECK_SIZE(spp); ND_PRINT(" linkmax %u namemax %u %s %s %s %s", - EXTRACT_BE_U_4(spp->pc_linkmax), - EXTRACT_BE_U_4(spp->pc_namemax), - EXTRACT_BE_U_4(spp->pc_notrunc) ? "notrunc" : "", - EXTRACT_BE_U_4(spp->pc_chownrestricted) ? "chownres" : "", - EXTRACT_BE_U_4(spp->pc_caseinsensitive) ? "igncase" : "", - EXTRACT_BE_U_4(spp->pc_casepreserving) ? "keepcase" : ""); + GET_BE_U_4(spp->pc_linkmax), + GET_BE_U_4(spp->pc_namemax), + GET_BE_U_4(spp->pc_notrunc) ? "notrunc" : "", + GET_BE_U_4(spp->pc_chownrestricted) ? "chownres" : "", + GET_BE_U_4(spp->pc_caseinsensitive) ? "igncase" : "", + GET_BE_U_4(spp->pc_casepreserving) ? "keepcase" : ""); return (1); trunc: return (0); @@ -1618,7 +1568,7 @@ interp_reply(netdissect_options *ndo, if (dp == NULL) goto trunc; if (v3) { - if (parsewccres(ndo, dp, ndo->ndo_vflag, &nfserr) == 0) + if (parsewccres(ndo, dp, ndo->ndo_vflag, &nfserr) == NULL) goto trunc; } else { if (parseattrstat(ndo, dp, !ndo->ndo_qflag, 0, &nfserr) == 0) @@ -1674,8 +1624,7 @@ interp_reply(netdissect_options *ndo, if (dp == NULL) goto trunc; if (!er) { - ND_TCHECK_4(dp); - ND_PRINT(" c %04x", EXTRACT_BE_U_4(dp)); + ND_PRINT(" c %04x", GET_BE_U_4(dp)); } break; @@ -1700,9 +1649,8 @@ interp_reply(netdissect_options *ndo, goto trunc; if (!er) { if (ndo->ndo_vflag) { - ND_TCHECK_4(dp + 1); - ND_PRINT(" %u bytes", EXTRACT_BE_U_4(dp)); - if (EXTRACT_BE_U_4(dp + 1)) + ND_PRINT(" %u bytes", GET_BE_U_4(dp)); + if (GET_BE_U_4(dp + 1)) ND_PRINT(" EOF"); } } @@ -1725,17 +1673,15 @@ interp_reply(netdissect_options *ndo, goto trunc; if (!er) { if (ndo->ndo_vflag) { - ND_TCHECK_4(dp); - ND_PRINT(" %u bytes", EXTRACT_BE_U_4(dp)); + ND_PRINT(" %u bytes", GET_BE_U_4(dp)); if (ndo->ndo_vflag > 1) { - ND_TCHECK_4(dp + 1); ND_PRINT(" <%s>", tok2str(nfsv3_writemodes, - NULL, EXTRACT_BE_U_4(dp + 1))); + NULL, GET_BE_U_4(dp + 1))); /* write-verf-cookie */ - ND_TCHECK_8(dp + 2); - ND_PRINT(" verf %" PRIx64, EXTRACT_BE_U_8(dp + 2)); + ND_PRINT(" verf %" PRIx64, + GET_BE_U_8(dp + 2)); } } } @@ -1898,8 +1844,7 @@ interp_reply(netdissect_options *ndo, goto trunc; if (ndo->ndo_vflag > 1) { /* write-verf-cookie */ - ND_TCHECK_8(dp); - ND_PRINT(" verf %" PRIx64, EXTRACT_BE_U_8(dp)); + ND_PRINT(" verf %" PRIx64, GET_BE_U_8(dp)); } break;