1 0 stevel /* 2 0 stevel * CDDL HEADER START 3 0 stevel * 4 0 stevel * The contents of this file are subject to the terms of the 5 1676 jpk * Common Development and Distribution License (the "License"). 6 1676 jpk * You may not use this file except in compliance with the License. 7 0 stevel * 8 0 stevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 0 stevel * or http://www.opensolaris.org/os/licensing. 10 0 stevel * See the License for the specific language governing permissions 11 0 stevel * and limitations under the License. 12 0 stevel * 13 0 stevel * When distributing Covered Code, include this CDDL HEADER in each 14 0 stevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 0 stevel * If applicable, add the following below this CDDL HEADER, with the 16 0 stevel * fields enclosed by brackets "[]" replaced with your own identifying 17 0 stevel * information: Portions Copyright [yyyy] [name of copyright owner] 18 0 stevel * 19 0 stevel * CDDL HEADER END 20 0 stevel */ 21 0 stevel /* 22 11134 Casper * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 0 stevel * Use is subject to license terms. 24 0 stevel */ 25 0 stevel 26 0 stevel /* 27 0 stevel * This file contains the envelope code for system call auditing. 28 0 stevel */ 29 0 stevel 30 0 stevel #include <sys/param.h> 31 0 stevel #include <sys/types.h> 32 0 stevel #include <sys/time.h> 33 0 stevel #include <sys/kmem.h> 34 0 stevel #include <sys/proc.h> 35 0 stevel #include <sys/vnode.h> 36 0 stevel #include <sys/file.h> 37 0 stevel #include <sys/user.h> 38 0 stevel #include <sys/stropts.h> 39 0 stevel #include <sys/systm.h> 40 0 stevel #include <sys/pathname.h> 41 0 stevel #include <sys/debug.h> 42 11134 Casper #include <sys/cred.h> 43 0 stevel #include <sys/zone.h> 44 0 stevel #include <c2/audit.h> 45 0 stevel #include <c2/audit_kernel.h> 46 0 stevel #include <c2/audit_kevents.h> 47 0 stevel #include <c2/audit_record.h> 48 0 stevel #include "audit_door_infc.h" 49 0 stevel 50 0 stevel extern uint_t num_syscall; /* size of audit_s2e table */ 51 0 stevel extern kmutex_t pidlock; /* proc table lock */ 52 0 stevel 53 0 stevel int audit_load = 0; /* set from /etc/system */ 54 0 stevel 55 0 stevel struct p_audit_data *pad0; 56 0 stevel struct t_audit_data *tad0; 57 0 stevel 58 0 stevel /* 59 0 stevel * Das Boot. Initialize first process. Also generate an audit record indicating 60 0 stevel * that the system has been booted. 61 0 stevel */ 62 0 stevel void 63 0 stevel audit_init() 64 0 stevel { 65 0 stevel kthread_t *au_thread; 66 0 stevel token_t *rp = NULL; 67 0 stevel label_t jb; 68 0 stevel struct audit_path apempty; 69 0 stevel auditinfo_addr_t *ainfo; 70 0 stevel 71 0 stevel if (audit_load == 0) { 72 0 stevel audit_active = 0; 73 0 stevel au_auditstate = AUC_DISABLED; 74 0 stevel return; 75 0 stevel #ifdef DEBUG 76 0 stevel } else if (audit_load == 2) { 77 0 stevel debug_enter((char *)NULL); 78 0 stevel #endif 79 0 stevel } 80 0 stevel 81 0 stevel audit_active = 1; 82 0 stevel set_all_proc_sys(); /* set pre- and post-syscall flags */ 83 0 stevel 84 0 stevel /* initialize memory allocators */ 85 0 stevel au_mem_init(); 86 0 stevel 87 0 stevel au_zone_setup(); 88 0 stevel 89 0 stevel /* inital thread structure */ 90 0 stevel tad0 = kmem_zalloc(sizeof (struct t_audit_data), KM_SLEEP); 91 0 stevel 92 0 stevel /* initial process structure */ 93 0 stevel pad0 = kmem_cache_alloc(au_pad_cache, KM_SLEEP); 94 0 stevel bzero(&pad0->pad_data, sizeof (pad0->pad_data)); 95 0 stevel 96 0 stevel T2A(curthread) = tad0; 97 0 stevel P2A(curproc) = pad0; 98 0 stevel 99 0 stevel /* 100 0 stevel * The kernel allocates a bunch of threads make sure they have 101 0 stevel * a valid tad 102 0 stevel */ 103 0 stevel 104 0 stevel mutex_enter(&pidlock); 105 0 stevel 106 0 stevel au_thread = curthread; 107 0 stevel do { 108 0 stevel if (T2A(au_thread) == NULL) { 109 0 stevel T2A(au_thread) = tad0; 110 0 stevel } 111 0 stevel au_thread = au_thread->t_next; 112 0 stevel } while (au_thread != curthread); 113 0 stevel 114 0 stevel tad0->tad_ad = NULL; 115 0 stevel mutex_exit(&pidlock); 116 0 stevel 117 0 stevel /* 118 0 stevel * Initialize audit context in our cred (kcred). 119 0 stevel * No copy-on-write needed here because it's so early in init. 120 0 stevel */ 121 0 stevel ainfo = crgetauinfo_modifiable(kcred); 122 0 stevel ASSERT(ainfo != NULL); 123 0 stevel bzero(ainfo, sizeof (auditinfo_addr_t)); 124 0 stevel ainfo->ai_auid = AU_NOAUDITID; 125 0 stevel 126 0 stevel /* fabricate an empty audit_path to extend */ 127 0 stevel apempty.audp_cnt = 0; 128 0 stevel apempty.audp_sect[0] = (char *)(&apempty.audp_sect[1]); 129 0 stevel pad0->pad_root = au_pathdup(&apempty, 1, 2); 130 0 stevel bcopy("/", pad0->pad_root->audp_sect[0], 2); 131 0 stevel au_pathhold(pad0->pad_root); 132 0 stevel pad0->pad_cwd = pad0->pad_root; 133 0 stevel 134 0 stevel /* 135 0 stevel * setup environment for asynchronous auditing. We can't use 136 0 stevel * audit_async_start() here since it assumes the audit system 137 0 stevel * has been started via auditd(1m). auditd sets the variable, 138 0 stevel * auk_auditstate, to indicate audit record generation should 139 0 stevel * commence. Here we want to always generate an audit record. 140 0 stevel */ 141 0 stevel if (setjmp(&jb)) { 142 0 stevel /* process audit policy (AUDIT_AHLT) for asynchronous events */ 143 0 stevel audit_async_drop((caddr_t *)(&rp), 0); 144 0 stevel return; 145 0 stevel } 146 0 stevel 147 0 stevel ASSERT(tad0->tad_errjmp == NULL); 148 0 stevel tad0->tad_errjmp = (void *)&jb; 149 0 stevel tad0->tad_ctrl |= PAD_ERRJMP; 150 0 stevel 151 0 stevel /* generate a system-booted audit record */ 152 0 stevel au_write((caddr_t *)&rp, au_to_text("booting kernel")); 153 0 stevel 154 0 stevel audit_async_finish((caddr_t *)&rp, AUE_SYSTEMBOOT, NULL); 155 0 stevel } 156 0 stevel 157 0 stevel void 158 0 stevel audit_free() 159 0 stevel { 160 0 stevel } 161 0 stevel 162 0 stevel /* 163 0 stevel * Check for any pending changes to the audit context for the given proc. 164 0 stevel * p_crlock and pad_lock for the process are acquired here. Caller is 165 0 stevel * responsible for assuring the process doesn't go away. If context is 166 0 stevel * updated, the specified cralloc'ed cred will be used, otherwise it's freed. 167 0 stevel * If no cred is given, it will be cralloc'ed here and caller assures that 168 0 stevel * it is safe to allocate memory. 169 0 stevel */ 170 0 stevel void 171 0 stevel audit_update_context(proc_t *p, cred_t *ncr) 172 0 stevel { 173 0 stevel struct p_audit_data *pad; 174 0 stevel cred_t *newcred = ncr; 175 0 stevel 176 0 stevel pad = P2A(p); 177 0 stevel if (pad == NULL) { 178 0 stevel if (newcred != NULL) 179 0 stevel crfree(newcred); 180 0 stevel return; 181 0 stevel } 182 0 stevel 183 0 stevel /* If a mask update is pending, take care of it. */ 184 0 stevel if (pad->pad_flags & PAD_SETMASK) { 185 0 stevel auditinfo_addr_t *ainfo; 186 0 stevel 187 0 stevel if (newcred == NULL) 188 0 stevel newcred = cralloc(); 189 0 stevel 190 0 stevel mutex_enter(&pad->pad_lock); 191 0 stevel /* the condition may have been handled by the time we lock */ 192 0 stevel if (pad->pad_flags & PAD_SETMASK) { 193 0 stevel ainfo = crgetauinfo_modifiable(newcred); 194 0 stevel if (ainfo == NULL) { 195 0 stevel mutex_enter(&pad->pad_lock); 196 0 stevel crfree(newcred); 197 0 stevel return; 198 0 stevel } 199 0 stevel 200 0 stevel mutex_enter(&p->p_crlock); 201 0 stevel crcopy_to(p->p_cred, newcred); 202 0 stevel p->p_cred = newcred; 203 0 stevel 204 0 stevel ainfo->ai_mask = pad->pad_newmask; 205 0 stevel 206 0 stevel /* Unlock and cleanup. */ 207 0 stevel mutex_exit(&p->p_crlock); 208 0 stevel pad->pad_flags &= ~PAD_SETMASK; 209 0 stevel 210 0 stevel /* 211 0 stevel * For curproc, assure that our thread points to right 212 0 stevel * cred, so CRED() will be correct. Otherwise, no need 213 0 stevel * to broadcast changes (via set_proc_pre_sys), since 214 0 stevel * t_pre_sys is ALWAYS on when audit is enabled... due 215 0 stevel * to syscall auditing. 216 0 stevel */ 217 0 stevel if (p == curproc) 218 0 stevel crset(p, newcred); 219 0 stevel else 220 0 stevel crfree(newcred); 221 0 stevel } else { 222 0 stevel crfree(newcred); 223 0 stevel } 224 0 stevel mutex_exit(&pad->pad_lock); 225 0 stevel } else { 226 0 stevel if (newcred != NULL) 227 0 stevel crfree(newcred); 228 0 stevel } 229 0 stevel } 230 0 stevel 231 0 stevel 232 0 stevel /* 233 0 stevel * Enter system call. Do any necessary setup here. allocate resouces, etc. 234 0 stevel */ 235 0 stevel 236 0 stevel #include <sys/syscall.h> 237 0 stevel 238 0 stevel 239 0 stevel /*ARGSUSED*/ 240 0 stevel int 241 0 stevel audit_start( 242 0 stevel unsigned type, 243 0 stevel unsigned scid, 244 0 stevel int error, 245 0 stevel klwp_t *lwp) 246 0 stevel { 247 0 stevel struct t_audit_data *tad; 248 0 stevel au_kcontext_t *kctx; 249 0 stevel 250 0 stevel tad = U2A(u); 251 0 stevel ASSERT(tad != NULL); 252 0 stevel 253 0 stevel if (error) { 254 0 stevel tad->tad_ctrl = 0; 255 0 stevel tad->tad_flag = 0; 256 0 stevel return (0); 257 0 stevel } 258 0 stevel 259 0 stevel audit_update_context(curproc, NULL); 260 0 stevel 261 0 stevel /* 262 0 stevel * if this is an indirect system call then don't do anything. 263 0 stevel * audit_start will be called again from indir() in trap.c 264 0 stevel */ 265 0 stevel if (scid == 0) { 266 0 stevel tad->tad_ctrl = 0; 267 0 stevel tad->tad_flag = 0; 268 0 stevel return (0); 269 0 stevel } 270 0 stevel if (scid >= num_syscall) 271 0 stevel scid = 0; 272 0 stevel 273 6207 gww /* 274 6207 gww * we can no longer depend on a valid lwp_ap, so we need to 275 6207 gww * copy the syscall args as future audit stuff may need them. 276 6207 gww */ 277 0 stevel (void) save_syscall_args(); 278 0 stevel 279 0 stevel /* 280 0 stevel * We need to gather paths for certain system calls even if they are 281 0 stevel * not audited so that we can audit the various f* calls and be 282 0 stevel * sure to have a CWD and CAR. Thus we thus set tad_ctrl over the 283 0 stevel * system call regardless if the call is audited or not. 284 6207 gww * We allow the event specific initial processing routines (au_init) 285 6207 gww * to adjust the tad_ctrl as necessary. 286 0 stevel */ 287 6207 gww tad->tad_ctrl = audit_s2e[scid].au_ctrl; 288 0 stevel tad->tad_scid = scid; 289 0 stevel 290 0 stevel /* get basic event for system call */ 291 6207 gww tad->tad_event = audit_s2e[scid].au_event; 292 7379 Ric if (audit_s2e[scid].au_init != (au_event_t)AUE_NULL) { 293 6207 gww /* get specific event */ 294 6207 gww tad->tad_event = (*audit_s2e[scid].au_init)(tad->tad_event); 295 6207 gww } 296 0 stevel 297 4197 paulson kctx = GET_KCTX_PZ; 298 0 stevel 299 0 stevel /* now do preselection. Audit or not to Audit, that is the question */ 300 6207 gww if ((tad->tad_flag = auditme(kctx, tad, 301 6207 gww kctx->auk_ets[tad->tad_event])) == 0) { 302 0 stevel /* 303 0 stevel * we assume that audit_finish will always be called. 304 0 stevel */ 305 0 stevel return (0); 306 0 stevel } 307 0 stevel 308 0 stevel /* 309 0 stevel * if auditing not enabled, then don't generate an audit record 310 0 stevel * and don't count it. 311 0 stevel */ 312 0 stevel if ((kctx->auk_auditstate != AUC_AUDITING && 313 0 stevel kctx->auk_auditstate != AUC_INIT_AUDIT)) { 314 0 stevel /* 315 0 stevel * we assume that audit_finish will always be called. 316 0 stevel */ 317 0 stevel tad->tad_flag = 0; 318 0 stevel return (0); 319 0 stevel } 320 0 stevel 321 0 stevel /* 322 0 stevel * audit daemon has informed us that there is no longer any 323 0 stevel * space left to hold audit records. We decide here if records 324 0 stevel * should be dropped (but counted). 325 0 stevel */ 326 0 stevel if (kctx->auk_auditstate == AUC_NOSPACE) { 327 0 stevel if ((kctx->auk_policy & AUDIT_CNT) || 328 0 stevel (kctx->auk_policy & AUDIT_SCNT)) { 329 0 stevel /* assume that audit_finish will always be called. */ 330 0 stevel tad->tad_flag = 0; 331 0 stevel 332 0 stevel /* just count # of dropped audit records */ 333 0 stevel AS_INC(as_dropped, 1, kctx); 334 0 stevel 335 0 stevel return (0); 336 0 stevel } 337 0 stevel } 338 0 stevel 339 0 stevel tad->tad_evmod = 0; 340 0 stevel 341 6207 gww if (audit_s2e[scid].au_start != NULL) { 342 6207 gww /* do start of system call processing */ 343 6207 gww (*audit_s2e[scid].au_start)(tad); 344 6207 gww } 345 0 stevel 346 0 stevel return (0); 347 0 stevel } 348 0 stevel 349 0 stevel /* 350 0 stevel * system call has completed. Now determine if we genearate an audit record 351 0 stevel * or not. 352 0 stevel */ 353 0 stevel /*ARGSUSED*/ 354 0 stevel void 355 0 stevel audit_finish( 356 0 stevel unsigned type, 357 0 stevel unsigned scid, 358 0 stevel int error, 359 0 stevel rval_t *rval) 360 0 stevel { 361 0 stevel struct t_audit_data *tad; 362 0 stevel int flag; 363 0 stevel au_defer_info_t *attr; 364 4197 paulson au_kcontext_t *kctx = GET_KCTX_PZ; 365 0 stevel 366 0 stevel tad = U2A(u); 367 0 stevel 368 0 stevel /* 369 0 stevel * Process all deferred events first. 370 0 stevel */ 371 0 stevel attr = tad->tad_defer_head; 372 0 stevel while (attr != NULL) { 373 0 stevel au_defer_info_t *tmp_attr = attr; 374 0 stevel 375 0 stevel au_close_time(kctx, (token_t *)attr->audi_ad, attr->audi_flag, 376 0 stevel attr->audi_e_type, attr->audi_e_mod, &(attr->audi_atime)); 377 0 stevel 378 0 stevel attr = attr->audi_next; 379 0 stevel kmem_free(tmp_attr, sizeof (au_defer_info_t)); 380 0 stevel } 381 0 stevel tad->tad_defer_head = tad->tad_defer_tail = NULL; 382 0 stevel 383 0 stevel if (tad->tad_flag == 0 && !(tad->tad_ctrl & PAD_SAVPATH)) { 384 0 stevel /* 385 0 stevel * clear the ctrl flag so that we don't have spurious 386 0 stevel * collection of audit information. 387 0 stevel */ 388 0 stevel tad->tad_scid = 0; 389 0 stevel tad->tad_event = 0; 390 0 stevel tad->tad_evmod = 0; 391 0 stevel tad->tad_ctrl = 0; 392 0 stevel ASSERT(tad->tad_aupath == NULL); 393 0 stevel return; 394 0 stevel } 395 0 stevel 396 0 stevel scid = tad->tad_scid; 397 0 stevel 398 0 stevel /* 399 0 stevel * Perform any extra processing and determine if we are 400 0 stevel * really going to generate any audit record. 401 0 stevel */ 402 6207 gww if (audit_s2e[scid].au_finish != NULL) { 403 6207 gww /* do any post system call processing */ 404 6207 gww (*audit_s2e[scid].au_finish)(tad, error, rval); 405 6207 gww } 406 0 stevel if (tad->tad_flag) { 407 0 stevel tad->tad_flag = 0; 408 0 stevel 409 4307 pwernau if (flag = audit_success(kctx, tad, error, NULL)) { 410 0 stevel unsigned int sy_flags; 411 0 stevel cred_t *cr = CRED(); 412 0 stevel const auditinfo_addr_t *ainfo = crgetauinfo(cr); 413 0 stevel 414 0 stevel ASSERT(ainfo != NULL); 415 0 stevel 416 2425 gww /* Add subject information */ 417 2425 gww AUDIT_SETSUBJ(&(u_ad), cr, ainfo, kctx); 418 1676 jpk 419 6207 gww if (tad->tad_evmod & PAD_SPRIVUSE) { 420 0 stevel au_write(&(u_ad), 421 6207 gww au_to_privset("", &tad->tad_sprivs, 422 6207 gww AUT_UPRIV, 1)); 423 6207 gww } 424 0 stevel 425 6207 gww if (tad->tad_evmod & PAD_FPRIVUSE) { 426 0 stevel au_write(&(u_ad), 427 6207 gww au_to_privset("", &tad->tad_fprivs, 428 6207 gww AUT_UPRIV, 0)); 429 6207 gww } 430 0 stevel 431 0 stevel /* Add a return token */ 432 6207 gww #ifdef _SYSCALL32_IMPL 433 6207 gww if (lwp_getdatamodel(ttolwp(curthread)) == 434 6207 gww DATAMODEL_NATIVE) { 435 6207 gww sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK; 436 6207 gww } else { 437 6207 gww sy_flags = 438 6207 gww sysent32[scid].sy_flags & SE_RVAL_MASK; 439 6207 gww } 440 6207 gww #else /* _SYSCALL64_IMPL */ 441 0 stevel sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK; 442 6207 gww #endif /* _SYSCALL32_IMPL */ 443 0 stevel 444 0 stevel if (sy_flags == SE_32RVAL1) { 445 6207 gww if (type == 0) { 446 6207 gww au_write(&(u_ad), 447 6207 gww au_to_return32(error, 0)); 448 6207 gww } else { 449 6207 gww au_write(&(u_ad), au_to_return32(error, 450 6207 gww rval->r_val1)); 451 6207 gww } 452 0 stevel } 453 0 stevel if (sy_flags == (SE_32RVAL2|SE_32RVAL1)) { 454 6207 gww if (type == 0) { 455 6207 gww au_write(&(u_ad), 456 6207 gww au_to_return32(error, 0)); 457 6207 gww } else { 458 6207 gww au_write(&(u_ad), 459 6207 gww au_to_return32(error, 460 6207 gww rval->r_val1)); 461 0 stevel #ifdef NOTYET /* for possible future support */ 462 6207 gww au_write(&(u_ad), au_to_return32(error, 463 6207 gww rval->r_val2)); 464 0 stevel #endif 465 6207 gww } 466 0 stevel } 467 0 stevel if (sy_flags == SE_64RVAL) { 468 6207 gww if (type == 0) { 469 6207 gww au_write(&(u_ad), 470 6207 gww au_to_return64(error, 0)); 471 6207 gww } else { 472 6207 gww au_write(&(u_ad), au_to_return64(error, 473 6207 gww rval->r_vals)); 474 6207 gww } 475 0 stevel } 476 0 stevel 477 0 stevel AS_INC(as_generated, 1, kctx); 478 0 stevel AS_INC(as_kernel, 1, kctx); 479 0 stevel } 480 0 stevel 481 0 stevel /* Close up everything */ 482 0 stevel au_close(kctx, &(u_ad), flag, tad->tad_event, tad->tad_evmod); 483 0 stevel } 484 0 stevel 485 0 stevel ASSERT(u_ad == NULL); 486 0 stevel 487 0 stevel /* free up any space remaining with the path's */ 488 0 stevel if (tad->tad_aupath != NULL) { 489 0 stevel au_pathrele(tad->tad_aupath); 490 0 stevel tad->tad_aupath = NULL; 491 0 stevel tad->tad_vn = NULL; 492 0 stevel } 493 0 stevel 494 0 stevel /* free up any space remaining with openat path's */ 495 0 stevel if (tad->tad_atpath) { 496 0 stevel au_pathrele(tad->tad_atpath); 497 0 stevel tad->tad_atpath = NULL; 498 0 stevel } 499 0 stevel 500 0 stevel /* 501 0 stevel * clear the ctrl flag so that we don't have spurious collection of 502 0 stevel * audit information. 503 0 stevel */ 504 0 stevel tad->tad_scid = 0; 505 0 stevel tad->tad_event = 0; 506 0 stevel tad->tad_evmod = 0; 507 0 stevel tad->tad_ctrl = 0; 508 0 stevel } 509 0 stevel 510 0 stevel int 511 4307 pwernau audit_success(au_kcontext_t *kctx, struct t_audit_data *tad, int error, 512 4307 pwernau cred_t *cr) 513 0 stevel { 514 0 stevel au_state_t ess; 515 0 stevel au_state_t esf; 516 0 stevel au_mask_t amask; 517 0 stevel const auditinfo_addr_t *ainfo; 518 0 stevel 519 0 stevel ess = esf = kctx->auk_ets[tad->tad_event]; 520 0 stevel 521 0 stevel if (error) 522 0 stevel tad->tad_evmod |= PAD_FAILURE; 523 0 stevel 524 0 stevel /* see if we really want to generate an audit record */ 525 0 stevel if (tad->tad_ctrl & PAD_NOAUDIT) 526 0 stevel return (0); 527 0 stevel 528 0 stevel /* 529 0 stevel * nfs operation and we're auditing privilege or MAC. This 530 0 stevel * is so we have a client audit record to match a nfs server 531 0 stevel * audit record. 532 0 stevel */ 533 0 stevel if (tad->tad_ctrl & PAD_AUDITME) 534 0 stevel return (AU_OK); 535 0 stevel 536 4307 pwernau /* 537 4307 pwernau * Used passed cred if available, otherwise use cred from kernel thread 538 4307 pwernau */ 539 4307 pwernau if (cr == NULL) 540 4307 pwernau cr = CRED(); 541 4307 pwernau ainfo = crgetauinfo(cr); 542 0 stevel if (ainfo == NULL) 543 0 stevel return (0); 544 0 stevel amask = ainfo->ai_mask; 545 0 stevel 546 0 stevel if (error == 0) 547 0 stevel return ((ess & amask.as_success) ? AU_OK : 0); 548 0 stevel else 549 0 stevel return ((esf & amask.as_failure) ? AU_OK : 0); 550 0 stevel } 551 0 stevel 552 0 stevel /* 553 0 stevel * determine if we've preselected this event (system call). 554 0 stevel */ 555 0 stevel int 556 0 stevel auditme(au_kcontext_t *kctx, struct t_audit_data *tad, au_state_t estate) 557 0 stevel { 558 0 stevel int flag = 0; 559 0 stevel au_mask_t amask; 560 0 stevel const auditinfo_addr_t *ainfo; 561 0 stevel 562 0 stevel ainfo = crgetauinfo(CRED()); 563 0 stevel if (ainfo == NULL) 564 0 stevel return (0); 565 0 stevel amask = ainfo->ai_mask; 566 0 stevel 567 0 stevel /* preselected system call */ 568 0 stevel 569 0 stevel if (amask.as_success & estate || amask.as_failure & estate) { 570 0 stevel flag = 1; 571 0 stevel } else if ((tad->tad_scid == SYS_putmsg) || 572 6207 gww (tad->tad_scid == SYS_getmsg)) { 573 0 stevel estate = kctx->auk_ets[AUE_SOCKCONNECT] | 574 6207 gww kctx->auk_ets[AUE_SOCKACCEPT] | 575 6207 gww kctx->auk_ets[AUE_SOCKSEND] | 576 6207 gww kctx->auk_ets[AUE_SOCKRECEIVE]; 577 0 stevel if (amask.as_success & estate || amask.as_failure & estate) 578 0 stevel flag = 1; 579 0 stevel } 580 0 stevel 581 0 stevel return (flag); 582 0 stevel } 583