summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/os/audit_memory.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/os/audit_memory.c')
-rw-r--r--usr/src/uts/common/os/audit_memory.c123
1 files changed, 123 insertions, 0 deletions
diff --git a/usr/src/uts/common/os/audit_memory.c b/usr/src/uts/common/os/audit_memory.c
new file mode 100644
index 0000000000..a3b61e13e2
--- /dev/null
+++ b/usr/src/uts/common/os/audit_memory.c
@@ -0,0 +1,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_add_32(&app->audp_ref, 1);
+}
+
+/*
+ * decrement audit path reference count
+ */
+void
+au_pathrele(struct audit_path *app)
+{
+ if (atomic_add_32_nv(&app->audp_ref, -1) > 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);
+}