Date: Wed, 17 Jun 2009 20:23:10 GMT From: Ilias Marinos <marinosi@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 164622 for review Message-ID: <200906172023.n5HKNA3M098259@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=164622 Change 164622 by marinosi@marinosi_redrum on 2009/06/17 20:23:07 Create audit_slice_create(), audit_slice_init(), audit_slice_destroy() functions to smoothly handle slice management. Affected files ... .. //depot/projects/soc2009/marinosi_appaudit/src/sys/security/audit/audit.c#5 edit .. //depot/projects/soc2009/marinosi_appaudit/src/sys/security/audit/audit_slice.h#3 edit .. //depot/projects/soc2009/marinosi_appaudit/src/sys/security/audit/audit_syscalls.c#4 edit Differences ... ==== //depot/projects/soc2009/marinosi_appaudit/src/sys/security/audit/audit.c#5 (text) ==== @@ -195,67 +195,31 @@ * synchronization primitives, worker thread, and trigger device node. Also * call into the BSM assembly code to initialize it. */ -void -audit_init(void *arg) +static void +audit_init(void) { - struct audit_slice *as; + struct audit_slice *as = NULL; /* * Initialize the slice queue and add every slice in it except the - * base(no reason to be in the queue). + * base(no reason to be in the queue). We want the queue initialized + * once, even if there are no other slices except the base one and + * thus this is happening in audit_init(). */ TAILQ_INIT(&audit_slice_q); - if ( audit_base_slice == NULL && arg == NULL ) { + if ( audit_base_slice == NULL ) { + /* + * If base slice is null, allocate the base slice. + */ audit_base_slice = malloc(sizeof(*audit_base_slice), M_AUDITSLICE, M_WAITOK | M_ZERO); - /* - * If base slice is null allocate and then initialize the base - * slice first of all. - */ as = audit_base_slice; - } else { - //as = (struct audit_slice *) arg; - as = malloc(sizeof(*as), M_AUDITSLICE, M_WAITOK | M_ZERO); - TAILQ_INSERT_TAIL(&audit_slice_q, as, as_q); } - /* - * XXX: As M_ZERO flag is used during allocation, we may remove some - * of the following initialization is useless. - */ - as->audit_enabled = 0; - as->audit_suspended = 0; - as->audit_panic_on_write_fail = 0; - as->audit_fail_stop = 0; - as->audit_in_failure = 0; - as->audit_argv = 0; - as->audit_arge = 0; - - - - as->audit_fstat.af_filesz = 0; /* '0' means unset, unbounded. */ - as->audit_fstat.af_currsz = 0; - as->audit_nae_mask.am_success = 0; - as->audit_nae_mask.am_failure = 0; - - TAILQ_INIT(&(as->audit_q)); - as->audit_q_len = 0; - as->audit_pre_q_len = 0; - as->audit_qctrl.aq_hiwater = AQ_HIWATER; - as->audit_qctrl.aq_lowater = AQ_LOWATER; - as->audit_qctrl.aq_bufsz = AQ_BUFSZ; - as->audit_qctrl.aq_minfree = AU_FS_MINFREE; + if ( as != NULL ) + audit_slice_init(as, "base_slice"); - audit_kinfo.ai_termid.at_type = AU_IPv4; - audit_kinfo.ai_termid.at_addr[0] = INADDR_ANY; - - mtx_init(&(as->audit_mtx), "audit_mtx", NULL, MTX_DEF); - KINFO_LOCK_INIT(); - cv_init(&(as->audit_worker_cv), "audit_worker_cv"); - cv_init(&(as->audit_watermark_cv), "audit_watermark_cv"); - cv_init(&(as->audit_fail_cv), "audit_fail_cv"); - audit_record_zone = uma_zcreate("audit_record", sizeof(struct kaudit_record), audit_record_ctor, audit_record_dtor, NULL, NULL, UMA_ALIGN_PTR, 0); @@ -660,6 +624,80 @@ } /* + * audit_slice_create() is called through A_CREATESLICE command of auditon() + * syscall to create a new slice.(except the base one!) + */ +void +audit_slice_create(char *name) +{ + struct audit_slice *as = NULL; + int ret; + + ret = 0; + as = malloc(sizeof(*as), M_AUDITSLICE, M_WAITOK | M_ZERO); + if ( as == NULL ) + ret = 1; /* Failed to allocate slice */ + + TAILQ_INSERT_TAIL(&audit_slice_q, as, as_q); + + /* Initialize the base slice */ + audit_slice_init(as, name); + + /* Start audit worker thread. */ + audit_worker_init(as); +} + +/* + * audit_slice_init() function is the initialization routine used for ALL + * slices (including the base one). + */ +void +audit_slice_init(struct audit_slice *as, char *name) +{ + strcpy(as->as_name, name); + + /* + * XXX: As M_ZERO flag is used during allocation, some of the + * following initilization is pointless and should be removed. + */ + as->audit_enabled = 0; + as->audit_suspended = 0; + as->audit_panic_on_write_fail = 0; + as->audit_fail_stop = 0; + as->audit_in_failure = 0; + as->audit_argv = 0; + as->audit_arge = 0; + + + + as->audit_fstat.af_filesz = 0; /* '0' means unset, unbounded. */ + as->audit_fstat.af_currsz = 0; + as->audit_nae_mask.am_success = 0; + as->audit_nae_mask.am_failure = 0; + + TAILQ_INIT(&(as->audit_q)); + as->audit_q_len = 0; + as->audit_pre_q_len = 0; + as->audit_qctrl.aq_hiwater = AQ_HIWATER; + as->audit_qctrl.aq_lowater = AQ_LOWATER; + as->audit_qctrl.aq_bufsz = AQ_BUFSZ; + as->audit_qctrl.aq_minfree = AU_FS_MINFREE; + + audit_kinfo.ai_termid.at_type = AU_IPv4; + audit_kinfo.ai_termid.at_addr[0] = INADDR_ANY; + + mtx_init(&(as->audit_mtx), "audit_mtx", NULL, MTX_DEF); + if ( as == audit_base_slice ) + KINFO_LOCK_INIT(); + + cv_init(&(as->audit_worker_cv), "audit_worker_cv"); + cv_init(&(as->audit_watermark_cv), "audit_watermark_cv"); + cv_init(&(as->audit_fail_cv), "audit_fail_cv"); + +} + + +/* * audit_slice_destroy() is called through A_REMOVESLICE command of auditon() * syscall to remove an existing slice ( except the base one!) */ ==== //depot/projects/soc2009/marinosi_appaudit/src/sys/security/audit/audit_slice.h#3 (text+ko) ==== @@ -172,9 +172,9 @@ /* * Audit related functions prototypes */ - -void audit_init(void *arg); void audit_rotate_vnode(struct ucred *cred, struct vnode *vp); void audit_worker_init(void *arg); +void audit_slice_init(struct audit_slice *as, char *name); +void audit_slice_create(char *name); void audit_slice_destroy(struct audit_slice *as); ==== //depot/projects/soc2009/marinosi_appaudit/src/sys/security/audit/audit_syscalls.c#4 (text) ==== @@ -546,8 +546,7 @@ /* Check if slice exists? */ if ((udata.au_slice.as_name == NULL)) return (EINVAL); - /* Passing null for testing purposes. TO be changed */ - audit_init(NULL); + audit_slice_create(udata.au_slice.as_name); break; case A_UPDATESLICE:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906172023.n5HKNA3M098259>