xref: /onnv-gate/usr/src/uts/common/os/audit_memory.c (revision 11861:a63258283f8f)
1*11861SMarek.Pospisil@Sun.COM /*
2*11861SMarek.Pospisil@Sun.COM  * CDDL HEADER START
3*11861SMarek.Pospisil@Sun.COM  *
4*11861SMarek.Pospisil@Sun.COM  * The contents of this file are subject to the terms of the
5*11861SMarek.Pospisil@Sun.COM  * Common Development and Distribution License (the "License").
6*11861SMarek.Pospisil@Sun.COM  * You may not use this file except in compliance with the License.
7*11861SMarek.Pospisil@Sun.COM  *
8*11861SMarek.Pospisil@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*11861SMarek.Pospisil@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*11861SMarek.Pospisil@Sun.COM  * See the License for the specific language governing permissions
11*11861SMarek.Pospisil@Sun.COM  * and limitations under the License.
12*11861SMarek.Pospisil@Sun.COM  *
13*11861SMarek.Pospisil@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*11861SMarek.Pospisil@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*11861SMarek.Pospisil@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*11861SMarek.Pospisil@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*11861SMarek.Pospisil@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*11861SMarek.Pospisil@Sun.COM  *
19*11861SMarek.Pospisil@Sun.COM  * CDDL HEADER END
20*11861SMarek.Pospisil@Sun.COM  */
21*11861SMarek.Pospisil@Sun.COM /*
22*11861SMarek.Pospisil@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23*11861SMarek.Pospisil@Sun.COM  * Use is subject to license terms.
24*11861SMarek.Pospisil@Sun.COM  */
25*11861SMarek.Pospisil@Sun.COM 
26*11861SMarek.Pospisil@Sun.COM #include <sys/param.h>
27*11861SMarek.Pospisil@Sun.COM #include <sys/types.h>
28*11861SMarek.Pospisil@Sun.COM #include <sys/kmem.h>
29*11861SMarek.Pospisil@Sun.COM #include <c2/audit.h>
30*11861SMarek.Pospisil@Sun.COM #include <c2/audit_kernel.h>
31*11861SMarek.Pospisil@Sun.COM 
32*11861SMarek.Pospisil@Sun.COM 
33*11861SMarek.Pospisil@Sun.COM /* process audit data (pad) cache */
34*11861SMarek.Pospisil@Sun.COM kmem_cache_t *au_pad_cache;
35*11861SMarek.Pospisil@Sun.COM 
36*11861SMarek.Pospisil@Sun.COM /*
37*11861SMarek.Pospisil@Sun.COM  * increment audit path reference count
38*11861SMarek.Pospisil@Sun.COM  */
39*11861SMarek.Pospisil@Sun.COM void
au_pathhold(struct audit_path * app)40*11861SMarek.Pospisil@Sun.COM au_pathhold(struct audit_path *app)
41*11861SMarek.Pospisil@Sun.COM {
42*11861SMarek.Pospisil@Sun.COM 	atomic_add_32(&app->audp_ref, 1);
43*11861SMarek.Pospisil@Sun.COM }
44*11861SMarek.Pospisil@Sun.COM 
45*11861SMarek.Pospisil@Sun.COM /*
46*11861SMarek.Pospisil@Sun.COM  * decrement audit path reference count
47*11861SMarek.Pospisil@Sun.COM  */
48*11861SMarek.Pospisil@Sun.COM void
au_pathrele(struct audit_path * app)49*11861SMarek.Pospisil@Sun.COM au_pathrele(struct audit_path *app)
50*11861SMarek.Pospisil@Sun.COM {
51*11861SMarek.Pospisil@Sun.COM 	if (atomic_add_32_nv(&app->audp_ref, -1) > 0)
52*11861SMarek.Pospisil@Sun.COM 		return;
53*11861SMarek.Pospisil@Sun.COM 	kmem_free(app, app->audp_size);
54*11861SMarek.Pospisil@Sun.COM }
55*11861SMarek.Pospisil@Sun.COM 
56*11861SMarek.Pospisil@Sun.COM /*
57*11861SMarek.Pospisil@Sun.COM  * allocate a new auditpath
58*11861SMarek.Pospisil@Sun.COM  *	newsect = increment sections count,
59*11861SMarek.Pospisil@Sun.COM  *	charincr = change in strings storage
60*11861SMarek.Pospisil@Sun.COM  */
61*11861SMarek.Pospisil@Sun.COM 
62*11861SMarek.Pospisil@Sun.COM struct audit_path *
au_pathdup(const struct audit_path * oldapp,int newsect,int charincr)63*11861SMarek.Pospisil@Sun.COM au_pathdup(const struct audit_path *oldapp, int newsect, int charincr)
64*11861SMarek.Pospisil@Sun.COM {
65*11861SMarek.Pospisil@Sun.COM 	struct audit_path	*newapp;
66*11861SMarek.Pospisil@Sun.COM 	int	i, alloc_size, oldlen;
67*11861SMarek.Pospisil@Sun.COM 	char	*oldcp, *newcp;
68*11861SMarek.Pospisil@Sun.COM 
69*11861SMarek.Pospisil@Sun.COM 	newsect = (newsect != 0);
70*11861SMarek.Pospisil@Sun.COM 	oldcp = oldapp->audp_sect[0];
71*11861SMarek.Pospisil@Sun.COM 	oldlen = (oldapp->audp_sect[oldapp->audp_cnt] - oldcp);
72*11861SMarek.Pospisil@Sun.COM 	alloc_size = sizeof (struct audit_path) +
73*11861SMarek.Pospisil@Sun.COM 	    (oldapp->audp_cnt + newsect) * sizeof (char *) +
74*11861SMarek.Pospisil@Sun.COM 	    oldlen + charincr;
75*11861SMarek.Pospisil@Sun.COM 
76*11861SMarek.Pospisil@Sun.COM 	newapp = kmem_alloc(alloc_size, KM_SLEEP);
77*11861SMarek.Pospisil@Sun.COM 	newapp->audp_ref = 1;
78*11861SMarek.Pospisil@Sun.COM 	newapp->audp_size = alloc_size;
79*11861SMarek.Pospisil@Sun.COM 
80*11861SMarek.Pospisil@Sun.COM 	newapp->audp_cnt = oldapp->audp_cnt + newsect;
81*11861SMarek.Pospisil@Sun.COM 	newcp = (char *)(&newapp->audp_sect[newapp->audp_cnt + 1]);
82*11861SMarek.Pospisil@Sun.COM 	for (i = 0; i <= oldapp->audp_cnt; i++) {
83*11861SMarek.Pospisil@Sun.COM 		newapp->audp_sect[i] = newcp +
84*11861SMarek.Pospisil@Sun.COM 		    (oldapp->audp_sect[i] - oldcp);
85*11861SMarek.Pospisil@Sun.COM 	}
86*11861SMarek.Pospisil@Sun.COM 	/*
87*11861SMarek.Pospisil@Sun.COM 	 * if this is a new section, set its end
88*11861SMarek.Pospisil@Sun.COM 	 * if this is an extended section, reset its end
89*11861SMarek.Pospisil@Sun.COM 	 */
90*11861SMarek.Pospisil@Sun.COM 	newapp->audp_sect[newapp->audp_cnt] = newcp + oldlen + charincr;
91*11861SMarek.Pospisil@Sun.COM 	/* copy all of the old strings */
92*11861SMarek.Pospisil@Sun.COM 	bcopy(oldcp, newcp, oldlen);
93*11861SMarek.Pospisil@Sun.COM 
94*11861SMarek.Pospisil@Sun.COM 	return (newapp);
95*11861SMarek.Pospisil@Sun.COM }
96*11861SMarek.Pospisil@Sun.COM 
97*11861SMarek.Pospisil@Sun.COM /*ARGSUSED1*/
98*11861SMarek.Pospisil@Sun.COM static int
au_pad_const(void * vpad,void * priv,int flags)99*11861SMarek.Pospisil@Sun.COM au_pad_const(void *vpad, void *priv, int flags)
100*11861SMarek.Pospisil@Sun.COM {
101*11861SMarek.Pospisil@Sun.COM 	p_audit_data_t *pad = vpad;
102*11861SMarek.Pospisil@Sun.COM 
103*11861SMarek.Pospisil@Sun.COM 	mutex_init(&pad->pad_lock, NULL, MUTEX_DEFAULT, NULL);
104*11861SMarek.Pospisil@Sun.COM 
105*11861SMarek.Pospisil@Sun.COM 	return (0);
106*11861SMarek.Pospisil@Sun.COM }
107*11861SMarek.Pospisil@Sun.COM 
108*11861SMarek.Pospisil@Sun.COM /*ARGSUSED1*/
109*11861SMarek.Pospisil@Sun.COM static void
au_pad_destr(void * vpad,void * priv)110*11861SMarek.Pospisil@Sun.COM au_pad_destr(void *vpad, void *priv)
111*11861SMarek.Pospisil@Sun.COM {
112*11861SMarek.Pospisil@Sun.COM 	p_audit_data_t *pad = vpad;
113*11861SMarek.Pospisil@Sun.COM 
114*11861SMarek.Pospisil@Sun.COM 	mutex_destroy(&pad->pad_lock);
115*11861SMarek.Pospisil@Sun.COM }
116*11861SMarek.Pospisil@Sun.COM 
117*11861SMarek.Pospisil@Sun.COM void
au_pad_init()118*11861SMarek.Pospisil@Sun.COM au_pad_init()
119*11861SMarek.Pospisil@Sun.COM {
120*11861SMarek.Pospisil@Sun.COM 	au_pad_cache = kmem_cache_create("audit_proc",
121*11861SMarek.Pospisil@Sun.COM 	    sizeof (p_audit_data_t), 0, au_pad_const, au_pad_destr,
122*11861SMarek.Pospisil@Sun.COM 	    NULL, NULL, NULL, 0);
123*11861SMarek.Pospisil@Sun.COM }
124