From owner-p4-projects@FreeBSD.ORG Sun Jan 11 21:30:17 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C58B016A4D1; Sun, 11 Jan 2004 21:30:16 -0800 (PST) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 7FC8E16A4CE for ; Sun, 11 Jan 2004 21:30:16 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 0839743D53 for ; Sun, 11 Jan 2004 21:30:14 -0800 (PST) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.10/8.12.10) with ESMTP id i0C5UD0B034994 for ; Sun, 11 Jan 2004 21:30:13 -0800 (PST) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.10/8.12.10/Submit) id i0C5UDvY034985 for perforce@freebsd.org; Sun, 11 Jan 2004 21:30:13 -0800 (PST) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Sun, 11 Jan 2004 21:30:13 -0800 (PST) Message-Id: <200401120530.i0C5UDvY034985@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson To: Perforce Change Reviews Subject: PERFORCE change 45191 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 12 Jan 2004 05:30:17 -0000 http://perforce.freebsd.org/chv.cgi?CH=45191 Change 45191 by rwatson@rwatson_paprika on 2004/01/11 21:30:12 More adaption for FreeBSDisms vs Machisms: - Use FreeBSD malloc() for audit record storage, path strings, etc. Eventually, we'll want to use a UMA zone for audit records. Note that, unlike on Darwin, with M_WAITOK, these calls can't fail. - Use FreeBSD free() to release allocated memory. - Use td->td_proc in more places to get access to process information. - Use td instead of p as argument to VFS calls. - Use td->td_ucred instead of p->p_ucred for credential externalization. Affected files ... .. //depot/projects/trustedbsd/audit2/sys/security/audit/audit.c#9 edit Differences ... ==== //depot/projects/trustedbsd/audit2/sys/security/audit/audit.c#9 (text+ko) ==== @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -45,8 +46,7 @@ #include #include -#define kmem_alloc(map, ptrref, size) -#define kmem_free(map, ptr, size) +MALLOC_DEFINE(M_AUDIT, "audit", "Audit event records"); #ifdef AUDIT @@ -136,24 +136,24 @@ audit_free(struct kaudit_record *ar) { if (ar->k_ar.ar_arg_upath1 != NULL) { - kmem_free(kernel_map, ar->k_ar.ar_arg_upath1, MAXPATHLEN); + free(ar->k_ar.ar_arg_upath1, M_AUDIT); } if (ar->k_ar.ar_arg_upath2 != NULL) { - kmem_free(kernel_map, ar->k_ar.ar_arg_upath2, MAXPATHLEN); + free(ar->k_ar.ar_arg_upath2, M_AUDIT); } if (ar->k_ar.ar_arg_kpath1 != NULL) { - kmem_free(kernel_map, ar->k_ar.ar_arg_kpath1, MAXPATHLEN); + free(ar->k_ar.ar_arg_kpath1, M_AUDIT); } if (ar->k_ar.ar_arg_kpath2 != NULL) { - kmem_free(kernel_map, ar->k_ar.ar_arg_kpath2, MAXPATHLEN); + free(ar->k_ar.ar_arg_kpath2, M_AUDIT); } if (ar->k_ar.ar_arg_text != NULL) { - kmem_free(kernel_map, ar->k_ar.ar_arg_text, MAXPATHLEN); + free(ar->k_ar.ar_arg_text, M_AUDIT); } if (ar->k_udata != NULL) { - kmem_free(kernel_map, ar->k_udata, ar->k_ulen); + free(ar->k_udata, M_AUDIT); } - kmem_free(kernel_map, ar, sizeof(*ar)); + free(ar, M_AUDIT); } static int @@ -512,10 +512,7 @@ if (uap->length > MAX_AUDIT_RECORD_SIZE) return (EINVAL); - error = kmem_alloc(kernel_map, (vm_offset_t *)&rec, uap->length); - if (error != KERN_SUCCESS) - return(ENOMEM); - + rec = malloc(uap->length, M_AUDIT, M_WAITOK); error = copyin(uap->record, rec, uap->length); if (error) goto free_out; @@ -535,7 +532,7 @@ return (0); free_out: - kmem_free(kernel_map, (vm_offset_t)rec, uap->length); + free(rec, M_AUDIT); return (error); } @@ -583,7 +580,7 @@ if (error) return (error); - error = copyout((void *)&p->p_au->ai_auid, (void *)uap->auid, + error = copyout((void *)&td->td_proc->p_au->ai_auid, (void *)uap->auid, sizeof(*uap->auid)); if (error) return (error); @@ -601,12 +598,12 @@ if (error) return (error); - error = copyin((void *)uap->auid, (void *)&p->p_au->ai_auid, - sizeof(p->p_au->ai_auid)); + error = copyin((void *)uap->auid, (void *)&td->td_proc->p_au->ai_auid, + sizeof(td->td_proc->p_au->ai_auid)); if (error) return (error); - audit_arg_auid(p->p_au->ai_auid); + audit_arg_auid(td->td_proc->p_au->ai_auid); return (0); } @@ -622,7 +619,7 @@ error = suser(td); if (error) return (error); - error = copyout((void *)p->p_au, (void *)uap->auditinfo, + error = copyout((void *)td->td_proc->p_au, (void *)uap->auditinfo, sizeof(*uap->auditinfo)); if (error) return (error); @@ -639,8 +636,8 @@ error = suser(td); if (error) return (error); - error = copyin((void *)uap->auditinfo, (void *)p->p_au, - sizeof(*p->p_au)); + error = copyin((void *)uap->auditinfo, (void *)td->td_proc->p_au, + sizeof(*td->td_proc->p_au)); if (error) return (error); @@ -699,15 +696,15 @@ */ if (uap->path != NULL) { NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE, - uap->path, p); + uap->path, td); flags = audit_open_flags; error = vn_open(&nd, &flags, 0, -1); if (error) goto out; - VOP_UNLOCK(nd.ni_vp, 0, p); + VOP_UNLOCK(nd.ni_vp, 0, td); vp = nd.ni_vp; if (vp->v_type != VREG) { - vn_close(vp, audit_close_flags, td->td_ucred, p); + vn_close(vp, audit_close_flags, td->td_ucred, td); error = EINVAL; goto out; } @@ -769,25 +766,22 @@ * safe to call from the non-BSD side of the house. * XXX: We may want to fail-stop if allocation fails. */ - (void)kmem_alloc(kernel_map, &ar, sizeof(*ar)); - if (ar == NULL) - return NULL; - + ar = malloc(sizeof(*ar), M_AUDIT, M_WAITOK); bzero(ar, sizeof(*ar)); ar->k_ar.ar_magic = AUDIT_RECORD_MAGIC; ar->k_ar.ar_event = event; nanotime(&ar->k_ar.ar_starttime); /* Export the subject credential. */ - cru2x(p->p_ucred, &ar->k_ar.ar_subj_cred); + cru2x(td->td_ucred, &ar->k_ar.ar_subj_cred); ar->k_ar.ar_subj_ruid = td->td_ucred->cr_ruid; ar->k_ar.ar_subj_rgid = td->td_ucred->cr_rgid; ar->k_ar.ar_subj_egid = td->td_ucred->cr_groups[0]; - ar->k_ar.ar_subj_auid = p->p_au->ai_auid; + ar->k_ar.ar_subj_auid = td->td_proc->p_au->ai_auid; ar->k_ar.ar_subj_pid = td->td_proc->p_pid; - bcopy(p->p_comm, ar->k_ar.ar_subj_comm, MAXCOMLEN); - bcopy(&p->p_au->ai_mask, &ar->k_ar.ar_subj_amask, - sizeof(p->p_au->ai_mask)); + bcopy(td->td_proc->p_comm, ar->k_ar.ar_subj_comm, MAXCOMLEN); + bcopy(&td->td_proc->p_au->ai_mask, &ar->k_ar.ar_subj_amask, + sizeof(td->td_proc->p_au->ai_mask)); return (ar); } @@ -1183,11 +1177,8 @@ if (text == NULL) return; - if (ar->k_ar.ar_arg_text == NULL) { - kmem_alloc(kernel_map, &ar->k_ar.ar_arg_text, MAXPATHLEN); - if (ar->k_ar.ar_arg_text == NULL) - return; - } + if (ar->k_ar.ar_arg_text == NULL) + ar->k_ar.ar_arg_text = malloc(MAXPATHLEN, M_AUDIT, M_WAITOK); strcpy(ar->k_ar.ar_arg_text, text); ar->k_ar.ar_valid_arg |= ARG_TEXT; @@ -1268,9 +1259,8 @@ void audit_proc_init(struct proc *p) { - MALLOC_ZONE(p->p_au, struct auditinfo *, sizeof(*p->p_au), - M_SUBPROC, M_WAITOK); + p->p_au = malloc(sizeof(*p->p_au), M_AUDIT, M_WAITOK); bzero((void *)p->p_au, sizeof(*p->p_au)); } @@ -1283,13 +1273,12 @@ void audit_proc_fork(struct proc *parent, struct proc *child) { + /* Always set up the audit information pointer as this function * should only be called when the proc is new. If proc structures * are ever cached and reused, then this behavior will leak memory. */ - MALLOC_ZONE(child->p_au, struct auditinfo *, sizeof(*child->p_au), - M_SUBPROC, M_WAITOK); - + child->p_au = malloc(sizeof(*child->p_au), M_AUDIT, M_WAITOK); bcopy(parent->p_au, child->p_au, sizeof(*child->p_au)); } @@ -1299,7 +1288,8 @@ void audit_proc_free(struct proc *p) { - FREE_ZONE((void *)p->p_au, sizeof(*p->p_au), M_SUBPROC); + + free(p->p_au, M_AUDIT); p->p_au = NULL; } @@ -1334,11 +1324,8 @@ pathp = &ar->k_ar.ar_arg_upath2; } - if (*pathp == NULL) { - kmem_alloc(kernel_map, pathp, MAXPATHLEN); - if (*pathp == NULL) - return; - } + if (*pathp == NULL) + pathp = malloc(MAXPATHLEN, M_AUDIT, M_WAITOK); canon_path(p, upath, *pathp); @@ -1398,11 +1385,8 @@ vnp = &ar->k_ar.ar_arg_vnode2; } - if (*pathp == NULL) { - kmem_alloc(kernel_map, pathp, MAXPATHLEN); - if (*pathp == NULL) - return; - } + if (*pathp == NULL) + pathp = malloc(MAXPATHLEN, M_AUDIT, M_WAITOK); /* Copy the path looked up by the vn_getpath() function */ len = MAXPATHLEN;