summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/os/audit_memory.c
blob: d7af4cb3f8e72a591a60fb2fbe772fea49d29206 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#include <sys/param.h>
#include <sys/types.h>
#include <sys/kmem.h>
#include <c2/audit.h>
#include <c2/audit_kernel.h>


/* process audit data (pad) cache */
kmem_cache_t *au_pad_cache;

/*
 * increment audit path reference count
 */
void
au_pathhold(struct audit_path *app)
{
	atomic_inc_32(&app->audp_ref);
}

/*
 * decrement audit path reference count
 */
void
au_pathrele(struct audit_path *app)
{
	if (atomic_dec_32_nv(&app->audp_ref) > 0)
		return;
	kmem_free(app, app->audp_size);
}

/*
 * allocate a new auditpath
 *	newsect = increment sections count,
 *	charincr = change in strings storage
 */

struct audit_path *
au_pathdup(const struct audit_path *oldapp, int newsect, int charincr)
{
	struct audit_path	*newapp;
	int	i, alloc_size, oldlen;
	char	*oldcp, *newcp;

	newsect = (newsect != 0);
	oldcp = oldapp->audp_sect[0];
	oldlen = (oldapp->audp_sect[oldapp->audp_cnt] - oldcp);
	alloc_size = sizeof (struct audit_path) +
	    (oldapp->audp_cnt + newsect) * sizeof (char *) +
	    oldlen + charincr;

	newapp = kmem_alloc(alloc_size, KM_SLEEP);
	newapp->audp_ref = 1;
	newapp->audp_size = alloc_size;

	newapp->audp_cnt = oldapp->audp_cnt + newsect;
	newcp = (char *)(&newapp->audp_sect[newapp->audp_cnt + 1]);
	for (i = 0; i <= oldapp->audp_cnt; i++) {
		newapp->audp_sect[i] = newcp +
		    (oldapp->audp_sect[i] - oldcp);
	}
	/*
	 * if this is a new section, set its end
	 * if this is an extended section, reset its end
	 */
	newapp->audp_sect[newapp->audp_cnt] = newcp + oldlen + charincr;
	/* copy all of the old strings */
	bcopy(oldcp, newcp, oldlen);

	return (newapp);
}

/*ARGSUSED1*/
static int
au_pad_const(void *vpad, void *priv, int flags)
{
	p_audit_data_t *pad = vpad;

	mutex_init(&pad->pad_lock, NULL, MUTEX_DEFAULT, NULL);

	return (0);
}

/*ARGSUSED1*/
static void
au_pad_destr(void *vpad, void *priv)
{
	p_audit_data_t *pad = vpad;

	mutex_destroy(&pad->pad_lock);
}

void
au_pad_init()
{
	au_pad_cache = kmem_cache_create("audit_proc",
	    sizeof (p_audit_data_t), 0, au_pad_const, au_pad_destr,
	    NULL, NULL, NULL, 0);
}