Print this page
7898 mdb's ::netstat doesn't print UDP conn_t pointer correctly

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/mdb/common/modules/genunix/net.c
          +++ new/usr/src/cmd/mdb/common/modules/genunix/net.c
↓ open down ↓ 635 lines elided ↑ open up ↑
 636  636  /*ARGSUSED*/
 637  637  static int
 638  638  netstat_udp_cb(uintptr_t kaddr, const void *walk_data, void *cb_data)
 639  639  {
 640  640          netstat_cb_data_t *ncb = cb_data;
 641  641          uint_t opts = ncb->opts;
 642  642          int af = ncb->af;
 643  643          udp_t udp;
 644  644          conn_t *connp = &ncb->conn;
 645  645          char *state;
      646 +        uintptr_t udp_kaddr;
 646  647  
 647  648          if (mdb_vread(connp, sizeof (conn_t), kaddr) == -1) {
 648  649                  mdb_warn("failed to read conn_t at %p", kaddr);
 649  650                  return (WALK_ERR);
 650  651          }
 651  652  
 652      -        if (mdb_vread(&udp, sizeof (udp_t),
 653      -            (uintptr_t)connp->conn_udp) == -1) {
 654      -                mdb_warn("failed to read conn_udp at %p",
 655      -                    (uintptr_t)connp->conn_udp);
      653 +        udp_kaddr = (uintptr_t)connp->conn_udp;
      654 +        if (mdb_vread(&udp, sizeof (udp_t), udp_kaddr) == -1) {
      655 +                mdb_warn("failed to read conn_udp at %p", udp_kaddr);
 656  656                  return (WALK_ERR);
 657  657          }
 658  658  
      659 +        /* Need to do these reassignments for the net_udp_*() routines below. */
 659  660          connp->conn_udp = &udp;
 660  661          udp.udp_connp = connp;
 661  662  
 662  663          if (!((opts & NETSTAT_ALL) || net_udp_active(&udp)) ||
 663  664              (af == AF_INET && !net_udp_ipv4(&udp)) ||
 664  665              (af == AF_INET6 && !net_udp_ipv6(&udp))) {
 665  666                  return (WALK_NEXT);
 666  667          }
 667  668  
 668  669          if (udp.udp_state == TS_UNBND)
 669  670                  state = "UNBOUND";
 670  671          else if (udp.udp_state == TS_IDLE)
 671  672                  state = "IDLE";
 672  673          else if (udp.udp_state == TS_DATA_XFER)
 673  674                  state = "CONNECTED";
 674  675          else
 675  676                  state = "UNKNOWN";
 676  677  
 677      -        mdb_printf("%0?p %10s ", (uintptr_t)connp->conn_udp, state);
      678 +        mdb_printf("%0?p %10s ", udp_kaddr, state);
 678  679          if (af == AF_INET) {
 679  680                  net_ipv4addrport_pr(&connp->conn_laddr_v6, connp->conn_lport);
 680  681                  mdb_printf(" ");
 681  682                  net_ipv4addrport_pr(&connp->conn_faddr_v6, connp->conn_fport);
 682  683          } else if (af == AF_INET6) {
 683  684                  net_ipv6addrport_pr(&connp->conn_laddr_v6, connp->conn_lport);
 684  685                  mdb_printf(" ");
 685  686                  net_ipv6addrport_pr(&connp->conn_faddr_v6, connp->conn_fport);
 686  687          }
 687  688          mdb_printf(" %5i", ns_to_stackid((uintptr_t)connp->conn_netstack));
↓ open down ↓ 955 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX