diff options
Diffstat (limited to 'usr/src/uts/common/c2/audit_event.c')
-rw-r--r-- | usr/src/uts/common/c2/audit_event.c | 111 |
1 files changed, 58 insertions, 53 deletions
diff --git a/usr/src/uts/common/c2/audit_event.c b/usr/src/uts/common/c2/audit_event.c index e1ffc61c81..25340134c9 100644 --- a/usr/src/uts/common/c2/audit_event.c +++ b/usr/src/uts/common/c2/audit_event.c @@ -5031,10 +5031,15 @@ aui_acl(au_event_t e) switch (uap->cmd) { case SETACL: - /* ok, acl(SETACL, ...) and facl(SETACL, ...) are expected. */ + case ACE_SETACL: + /* + * acl(SETACL/ACE_SETACL, ...) and facl(SETACL/ACE_SETACL, ...) + * are expected. + */ break; case GETACL: case GETACLCNT: + case ACE_GETACLCNT: /* do nothing for these two values. */ e = AUE_NULL; break; @@ -5046,44 +5051,52 @@ aui_acl(au_event_t e) return (e); } - -/*ARGSUSED*/ static void -aus_acl(struct t_audit_data *tad) +au_acl(int cmd, int nentries, caddr_t bufp) { - struct a { - long fname; - long cmd; - long nentries; - long aclbufp; - } *uap = (struct a *)ttolwp(curthread)->lwp_ap; - struct acl *aclbufp; - - au_uwrite(au_to_arg32(2, "cmd", (uint32_t)uap->cmd)); - au_uwrite(au_to_arg32(3, "nentries", (uint32_t)uap->nentries)); + size_t a_size; + aclent_t *aclbufp; + ace_t *acebufp; + int i; - switch (uap->cmd) { + switch (cmd) { case GETACL: case GETACLCNT: break; case SETACL: - if (uap->nentries < 3) + if (nentries < 3) break; - else { - size_t a_size = uap->nentries * sizeof (struct acl); - int i; - aclbufp = kmem_alloc(a_size, KM_SLEEP); - if (copyin((caddr_t)(uap->aclbufp), aclbufp, a_size)) { - kmem_free(aclbufp, a_size); - break; - } - for (i = 0; i < uap->nentries; i++) { - au_uwrite(au_to_acl(aclbufp + i)); - } + a_size = nentries * sizeof (aclent_t); + + if ((aclbufp = kmem_alloc(a_size, KM_SLEEP)) == NULL) + break; + if (copyin(bufp, aclbufp, a_size)) { kmem_free(aclbufp, a_size); break; } + for (i = 0; i < nentries; i++) { + au_uwrite(au_to_acl(aclbufp + i)); + } + kmem_free(aclbufp, a_size); + break; + + case ACE_SETACL: + if (nentries < 1 || nentries > MAX_ACL_ENTRIES) + break; + + a_size = nentries * sizeof (ace_t); + if ((acebufp = kmem_alloc(a_size, KM_SLEEP)) == NULL) + break; + if (copyin(bufp, acebufp, a_size)) { + kmem_free(acebufp, a_size); + break; + } + for (i = 0; i < nentries; i++) { + au_uwrite(au_to_ace(acebufp + i)); + } + kmem_free(acebufp, a_size); + break; default: break; } @@ -5091,6 +5104,23 @@ aus_acl(struct t_audit_data *tad) /*ARGSUSED*/ static void +aus_acl(struct t_audit_data *tad) +{ + struct a { + long fname; + long cmd; + long nentries; + long aclbufp; + } *uap = (struct a *)ttolwp(curthread)->lwp_ap; + + au_uwrite(au_to_arg32(2, "cmd", (uint32_t)uap->cmd)); + au_uwrite(au_to_arg32(3, "nentries", (uint32_t)uap->nentries)); + + au_acl(uap->cmd, uap->nentries, (caddr_t)uap->aclbufp); +} + +/*ARGSUSED*/ +static void aus_facl(struct t_audit_data *tad) { struct a { @@ -5102,7 +5132,6 @@ aus_facl(struct t_audit_data *tad) struct file *fp; struct vnode *vp; struct f_audit_data *fad; - struct acl *aclbufp; int fd; au_uwrite(au_to_arg32(2, "cmd", (uint32_t)uap->cmd)); @@ -5127,31 +5156,7 @@ aus_facl(struct t_audit_data *tad) /* decrement file descriptor reference count */ releasef(fd); - switch (uap->cmd) { - case GETACL: - case GETACLCNT: - break; - case SETACL: - if (uap->nentries < 3) - break; - else { - size_t a_size = uap->nentries * sizeof (struct acl); - int i; - - aclbufp = kmem_alloc(a_size, KM_SLEEP); - if (copyin((caddr_t)(uap->aclbufp), aclbufp, a_size)) { - kmem_free(aclbufp, a_size); - break; - } - for (i = 0; i < uap->nentries; i++) { - au_uwrite(au_to_acl(aclbufp + i)); - } - kmem_free(aclbufp, a_size); - break; - } - default: - break; - } + au_acl(uap->cmd, uap->nentries, (caddr_t)uap->aclbufp); } /*ARGSUSED*/ |