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
cmd_cred(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)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
cmd_credgrp(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)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
cmd_credsid(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)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
cmd_ksidlist(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)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
print_ksid(const ksid_t * ks)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