1*0605fe78SGordon Ross /* 2*0605fe78SGordon Ross * This file and its contents are supplied under the terms of the 3*0605fe78SGordon Ross * Common Development and Distribution License ("CDDL"), version 1.0. 4*0605fe78SGordon Ross * You may only use this file in accordance with the terms of version 5*0605fe78SGordon Ross * 1.0 of the CDDL. 6*0605fe78SGordon Ross * 7*0605fe78SGordon Ross * A full copy of the text of the CDDL should have accompanied this 8*0605fe78SGordon Ross * source. A copy of the CDDL is also available via the Internet at 9*0605fe78SGordon Ross * http://www.illumos.org/license/CDDL. 10*0605fe78SGordon Ross */ 11*0605fe78SGordon Ross 12*0605fe78SGordon Ross /* 13*0605fe78SGordon Ross * Copyright 2011 Nexenta Systems, Inc. All rights reserved. 14*0605fe78SGordon Ross */ 15*0605fe78SGordon Ross 16*0605fe78SGordon Ross #include <mdb/mdb_modapi.h> 17*0605fe78SGordon Ross #include <sys/types.h> 18*0605fe78SGordon Ross #include <sys/cred_impl.h> 19*0605fe78SGordon Ross #include <sys/sid.h> 20*0605fe78SGordon Ross 21*0605fe78SGordon Ross #include "cred.h" 22*0605fe78SGordon Ross 23*0605fe78SGordon Ross #define OPT_VERBOSE 1 24*0605fe78SGordon Ross 25*0605fe78SGordon Ross static void print_ksid(const ksid_t *); 26*0605fe78SGordon Ross 27*0605fe78SGordon Ross /* 28*0605fe78SGordon Ross * dcmd ::cred - display a credential (cred_t) 29*0605fe78SGordon Ross */ 30*0605fe78SGordon Ross int 31*0605fe78SGordon Ross cmd_cred(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 32*0605fe78SGordon Ross { 33*0605fe78SGordon Ross credgrp_t cr_grps; 34*0605fe78SGordon Ross cred_t *cr; 35*0605fe78SGordon Ross mdb_arg_t cmdarg; 36*0605fe78SGordon Ross uint_t opts = FALSE; 37*0605fe78SGordon Ross 38*0605fe78SGordon Ross if (mdb_getopts(argc, argv, 39*0605fe78SGordon Ross 'v', MDB_OPT_SETBITS, OPT_VERBOSE, &opts, NULL) != argc) 40*0605fe78SGordon Ross return (DCMD_USAGE); 41*0605fe78SGordon Ross 42*0605fe78SGordon Ross if (!(flags & DCMD_ADDRSPEC)) { 43*0605fe78SGordon Ross return (DCMD_USAGE); 44*0605fe78SGordon Ross } 45*0605fe78SGordon Ross 46*0605fe78SGordon Ross cr = mdb_alloc(sizeof (*cr), UM_SLEEP | UM_GC); 47*0605fe78SGordon Ross if (mdb_vread(cr, sizeof (*cr), addr) == -1) { 48*0605fe78SGordon Ross mdb_warn("error reading cred_t at %p", addr); 49*0605fe78SGordon Ross return (DCMD_ERR); 50*0605fe78SGordon Ross } 51*0605fe78SGordon Ross 52*0605fe78SGordon Ross if (cr->cr_grps == NULL) { 53*0605fe78SGordon Ross bzero(&cr_grps, sizeof (cr_grps)); 54*0605fe78SGordon Ross } else { 55*0605fe78SGordon Ross if (mdb_vread(&cr_grps, sizeof (cr_grps), 56*0605fe78SGordon Ross (uintptr_t)cr->cr_grps) == -1) { 57*0605fe78SGordon Ross mdb_warn("error reading credgrp_t at %p", 58*0605fe78SGordon Ross cr->cr_grps); 59*0605fe78SGordon Ross return (DCMD_ERR); 60*0605fe78SGordon Ross } 61*0605fe78SGordon Ross } 62*0605fe78SGordon Ross 63*0605fe78SGordon Ross if (opts & OPT_VERBOSE) { 64*0605fe78SGordon Ross cmdarg.a_type = MDB_TYPE_STRING; 65*0605fe78SGordon Ross cmdarg.a_un.a_str = "cred_t"; 66*0605fe78SGordon Ross (void) mdb_call_dcmd("print", addr, flags, 1, &cmdarg); 67*0605fe78SGordon Ross cmdarg.a_un.a_str = "-v"; 68*0605fe78SGordon Ross 69*0605fe78SGordon Ross mdb_printf("%<u>cr_grps:%</u>\n"); 70*0605fe78SGordon Ross mdb_inc_indent(4); 71*0605fe78SGordon Ross if (cr->cr_grps == NULL) { 72*0605fe78SGordon Ross mdb_printf("(null)\n"); 73*0605fe78SGordon Ross } else { 74*0605fe78SGordon Ross (void) mdb_call_dcmd("credgrp", 75*0605fe78SGordon Ross (uintptr_t)cr->cr_grps, flags, 1, &cmdarg); 76*0605fe78SGordon Ross } 77*0605fe78SGordon Ross mdb_dec_indent(4); 78*0605fe78SGordon Ross 79*0605fe78SGordon Ross mdb_printf("%<u>cr_ksid:%</u>\n"); 80*0605fe78SGordon Ross mdb_inc_indent(4); 81*0605fe78SGordon Ross if (cr->cr_ksid == NULL) { 82*0605fe78SGordon Ross mdb_printf("(null)\n"); 83*0605fe78SGordon Ross } else { 84*0605fe78SGordon Ross (void) mdb_call_dcmd("credsid", 85*0605fe78SGordon Ross (uintptr_t)cr->cr_ksid, flags, 1, &cmdarg); 86*0605fe78SGordon Ross } 87*0605fe78SGordon Ross mdb_dec_indent(4); 88*0605fe78SGordon Ross 89*0605fe78SGordon Ross return (DCMD_OK); 90*0605fe78SGordon Ross } 91*0605fe78SGordon Ross 92*0605fe78SGordon Ross if (DCMD_HDRSPEC(flags)) 93*0605fe78SGordon Ross mdb_printf("%<u>%?s %8s %8s %8s %8s% %8s%</u>\n", 94*0605fe78SGordon Ross "ADDR", "UID", "GID", "RUID", "RGID", "#GRP(+SIDS)"); 95*0605fe78SGordon Ross 96*0605fe78SGordon Ross mdb_printf("%0?p %8u %8u %8u %8u %4u%s\n", addr, 97*0605fe78SGordon Ross cr->cr_uid, cr->cr_gid, 98*0605fe78SGordon Ross cr->cr_ruid, cr->cr_rgid, 99*0605fe78SGordon Ross cr_grps.crg_ngroups, 100*0605fe78SGordon Ross (cr->cr_ksid == NULL) ? "" : "+"); 101*0605fe78SGordon Ross 102*0605fe78SGordon Ross return (DCMD_OK); 103*0605fe78SGordon Ross } 104*0605fe78SGordon Ross 105*0605fe78SGordon Ross /* 106*0605fe78SGordon Ross * dcmd ::credgrp - display cred_t groups 107*0605fe78SGordon Ross */ 108*0605fe78SGordon Ross int 109*0605fe78SGordon Ross cmd_credgrp(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 110*0605fe78SGordon Ross { 111*0605fe78SGordon Ross credgrp_t grps; 112*0605fe78SGordon Ross gid_t gid; 113*0605fe78SGordon Ross uint_t i, opts = FALSE; 114*0605fe78SGordon Ross int rv = DCMD_OK; 115*0605fe78SGordon Ross 116*0605fe78SGordon Ross if (mdb_getopts(argc, argv, 117*0605fe78SGordon Ross 'v', MDB_OPT_SETBITS, OPT_VERBOSE, &opts, NULL) != argc) 118*0605fe78SGordon Ross return (DCMD_USAGE); 119*0605fe78SGordon Ross 120*0605fe78SGordon Ross if (!(flags & DCMD_ADDRSPEC)) { 121*0605fe78SGordon Ross return (DCMD_USAGE); 122*0605fe78SGordon Ross } 123*0605fe78SGordon Ross 124*0605fe78SGordon Ross if (mdb_vread(&grps, sizeof (grps), addr) == -1) { 125*0605fe78SGordon Ross mdb_warn("error reading credgrp_t at %p", addr); 126*0605fe78SGordon Ross return (DCMD_ERR); 127*0605fe78SGordon Ross } 128*0605fe78SGordon Ross 129*0605fe78SGordon Ross if (opts & OPT_VERBOSE) { 130*0605fe78SGordon Ross mdb_printf("crg_ref = 0x%x\n", grps.crg_ref); 131*0605fe78SGordon Ross mdb_printf("crg_ngroups = 0x%x\n", grps.crg_ngroups); 132*0605fe78SGordon Ross } 133*0605fe78SGordon Ross mdb_printf("crg_groups = [\n"); 134*0605fe78SGordon Ross 135*0605fe78SGordon Ross addr += OFFSETOF(credgrp_t, crg_groups); 136*0605fe78SGordon Ross mdb_inc_indent(4); 137*0605fe78SGordon Ross for (i = 0; i < grps.crg_ngroups; i++, addr += sizeof (gid_t)) { 138*0605fe78SGordon Ross if (mdb_vread(&gid, sizeof (gid), addr) == -1) { 139*0605fe78SGordon Ross mdb_warn("error reading gid_t at %p", addr); 140*0605fe78SGordon Ross rv = DCMD_ERR; 141*0605fe78SGordon Ross break; 142*0605fe78SGordon Ross } 143*0605fe78SGordon Ross mdb_printf("\t%u,", gid); 144*0605fe78SGordon Ross } 145*0605fe78SGordon Ross mdb_dec_indent(4); 146*0605fe78SGordon Ross mdb_printf("\n]\n"); 147*0605fe78SGordon Ross 148*0605fe78SGordon Ross return (rv); 149*0605fe78SGordon Ross } 150*0605fe78SGordon Ross 151*0605fe78SGordon Ross /* 152*0605fe78SGordon Ross * dcmd ::credsid - display a credsid_t 153*0605fe78SGordon Ross */ 154*0605fe78SGordon Ross int 155*0605fe78SGordon Ross cmd_credsid(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 156*0605fe78SGordon Ross { 157*0605fe78SGordon Ross credsid_t kr; 158*0605fe78SGordon Ross uint_t opts = FALSE; 159*0605fe78SGordon Ross int rv = DCMD_OK; 160*0605fe78SGordon Ross 161*0605fe78SGordon Ross if (mdb_getopts(argc, argv, 162*0605fe78SGordon Ross 'v', MDB_OPT_SETBITS, OPT_VERBOSE, &opts, NULL) != argc) 163*0605fe78SGordon Ross return (DCMD_USAGE); 164*0605fe78SGordon Ross 165*0605fe78SGordon Ross if (!(flags & DCMD_ADDRSPEC)) { 166*0605fe78SGordon Ross return (DCMD_USAGE); 167*0605fe78SGordon Ross } 168*0605fe78SGordon Ross 169*0605fe78SGordon Ross if (mdb_vread(&kr, sizeof (kr), addr) == -1) { 170*0605fe78SGordon Ross mdb_warn("error reading credsid_t at %p", addr); 171*0605fe78SGordon Ross return (DCMD_ERR); 172*0605fe78SGordon Ross } 173*0605fe78SGordon Ross 174*0605fe78SGordon Ross if (opts & OPT_VERBOSE) 175*0605fe78SGordon Ross mdb_printf("kr_ref = 0x%x\n", kr.kr_ref); 176*0605fe78SGordon Ross 177*0605fe78SGordon Ross mdb_printf("kr_sidx[USER] = "); 178*0605fe78SGordon Ross print_ksid(&kr.kr_sidx[KSID_USER]); 179*0605fe78SGordon Ross 180*0605fe78SGordon Ross mdb_printf("kr_sidx[GROUP] = "); 181*0605fe78SGordon Ross print_ksid(&kr.kr_sidx[KSID_GROUP]); 182*0605fe78SGordon Ross 183*0605fe78SGordon Ross mdb_printf("kr_sidx[OWNER] = "); 184*0605fe78SGordon Ross print_ksid(&kr.kr_sidx[KSID_OWNER]); 185*0605fe78SGordon Ross 186*0605fe78SGordon Ross mdb_printf("kr_sidlist = %p\n", kr.kr_sidlist); 187*0605fe78SGordon Ross if (kr.kr_sidlist != NULL && (opts & OPT_VERBOSE) != 0) { 188*0605fe78SGordon Ross mdb_printf("*kr_sidlist = {\n"); 189*0605fe78SGordon Ross mdb_inc_indent(4); 190*0605fe78SGordon Ross rv = mdb_call_dcmd("ksidlist", 191*0605fe78SGordon Ross (uintptr_t)kr.kr_sidlist, flags, argc, argv); 192*0605fe78SGordon Ross mdb_dec_indent(4); 193*0605fe78SGordon Ross mdb_printf("}\n"); 194*0605fe78SGordon Ross } 195*0605fe78SGordon Ross 196*0605fe78SGordon Ross return (rv); 197*0605fe78SGordon Ross } 198*0605fe78SGordon Ross 199*0605fe78SGordon Ross /* 200*0605fe78SGordon Ross * dcmd ::ksidlist - display a ksidlist_t 201*0605fe78SGordon Ross */ 202*0605fe78SGordon Ross int 203*0605fe78SGordon Ross cmd_ksidlist(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 204*0605fe78SGordon Ross { 205*0605fe78SGordon Ross ksidlist_t ksl; 206*0605fe78SGordon Ross ksid_t ks; 207*0605fe78SGordon Ross uint_t i, opts = FALSE; 208*0605fe78SGordon Ross int rv = DCMD_OK; 209*0605fe78SGordon Ross 210*0605fe78SGordon Ross if (mdb_getopts(argc, argv, 211*0605fe78SGordon Ross 'v', MDB_OPT_SETBITS, OPT_VERBOSE, &opts, NULL) != argc) 212*0605fe78SGordon Ross return (DCMD_USAGE); 213*0605fe78SGordon Ross 214*0605fe78SGordon Ross if (!(flags & DCMD_ADDRSPEC)) { 215*0605fe78SGordon Ross return (DCMD_USAGE); 216*0605fe78SGordon Ross } 217*0605fe78SGordon Ross 218*0605fe78SGordon Ross if (mdb_vread(&ksl, sizeof (ksl), addr) == -1) { 219*0605fe78SGordon Ross mdb_warn("error reading ksidlist_t at %p", addr); 220*0605fe78SGordon Ross return (DCMD_ERR); 221*0605fe78SGordon Ross } 222*0605fe78SGordon Ross 223*0605fe78SGordon Ross if (opts & OPT_VERBOSE) { 224*0605fe78SGordon Ross mdb_printf("ksl_ref = 0x%x\n", ksl.ksl_ref); 225*0605fe78SGordon Ross mdb_printf("ksl_nsid = 0x%x\n", ksl.ksl_nsid); 226*0605fe78SGordon Ross mdb_printf("ksl_neid = 0x%x\n", ksl.ksl_neid); 227*0605fe78SGordon Ross } 228*0605fe78SGordon Ross 229*0605fe78SGordon Ross mdb_printf("ksl_sids = [\n"); 230*0605fe78SGordon Ross addr += OFFSETOF(ksidlist_t, ksl_sids); 231*0605fe78SGordon Ross mdb_inc_indent(4); 232*0605fe78SGordon Ross for (i = 0; i < ksl.ksl_nsid; i++, addr += sizeof (ksid_t)) { 233*0605fe78SGordon Ross if (mdb_vread(&ks, sizeof (ks), addr) == -1) { 234*0605fe78SGordon Ross mdb_warn("error reading ksid_t at %p", addr); 235*0605fe78SGordon Ross rv = DCMD_ERR; 236*0605fe78SGordon Ross break; 237*0605fe78SGordon Ross } 238*0605fe78SGordon Ross print_ksid(&ks); 239*0605fe78SGordon Ross } 240*0605fe78SGordon Ross mdb_dec_indent(4); 241*0605fe78SGordon Ross mdb_printf("]\n"); 242*0605fe78SGordon Ross 243*0605fe78SGordon Ross return (rv); 244*0605fe78SGordon Ross } 245*0605fe78SGordon Ross 246*0605fe78SGordon Ross static void 247*0605fe78SGordon Ross print_ksid(const ksid_t *ks) 248*0605fe78SGordon Ross { 249*0605fe78SGordon Ross char str[80]; 250*0605fe78SGordon Ross ksiddomain_t kd; 251*0605fe78SGordon Ross uintptr_t da, sa; 252*0605fe78SGordon Ross 253*0605fe78SGordon Ross /* in case of errors */ 254*0605fe78SGordon Ross strcpy(str, "(domain?)"); 255*0605fe78SGordon Ross 256*0605fe78SGordon Ross da = (uintptr_t)ks->ks_domain; 257*0605fe78SGordon Ross if (da == 0 || mdb_vread(&kd, sizeof (kd), da) < 0) 258*0605fe78SGordon Ross bzero(&kd, sizeof (kd)); 259*0605fe78SGordon Ross sa = (uintptr_t)kd.kd_name; 260*0605fe78SGordon Ross if (sa != 0) 261*0605fe78SGordon Ross (void) mdb_readstr(str, sizeof (str), sa); 262*0605fe78SGordon Ross 263*0605fe78SGordon Ross mdb_printf("%s-%u,\n", str, ks->ks_rid); 264*0605fe78SGordon Ross } 265