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