1f6d4a8a7SRobert Watson /*- 2bc9a43d6SRobert Watson * Copyright (c) 1999-2005 Apple Inc. 3718c8510SRobert Watson * All rights reserved. 4718c8510SRobert Watson * 5718c8510SRobert Watson * Redistribution and use in source and binary forms, with or without 6718c8510SRobert Watson * modification, are permitted provided that the following conditions 7718c8510SRobert Watson * are met: 8718c8510SRobert Watson * 1. Redistributions of source code must retain the above copyright 9718c8510SRobert Watson * notice, this list of conditions and the following disclaimer. 10718c8510SRobert Watson * 2. Redistributions in binary form must reproduce the above copyright 11718c8510SRobert Watson * notice, this list of conditions and the following disclaimer in the 12718c8510SRobert Watson * documentation and/or other materials provided with the distribution. 13bc9a43d6SRobert Watson * 3. Neither the name of Apple Inc. ("Apple") nor the names of 14718c8510SRobert Watson * its contributors may be used to endorse or promote products derived 15718c8510SRobert Watson * from this software without specific prior written permission. 16718c8510SRobert Watson * 17718c8510SRobert Watson * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND 18718c8510SRobert Watson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19718c8510SRobert Watson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20718c8510SRobert Watson * ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR 21718c8510SRobert Watson * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22718c8510SRobert Watson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23718c8510SRobert Watson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24718c8510SRobert Watson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 25718c8510SRobert Watson * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 26718c8510SRobert Watson * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27718c8510SRobert Watson * POSSIBILITY OF SUCH DAMAGE. 28718c8510SRobert Watson */ 29718c8510SRobert Watson 30dda409d4SRobert Watson #include <sys/cdefs.h> 31dda409d4SRobert Watson __FBSDID("$FreeBSD$"); 32dda409d4SRobert Watson 33718c8510SRobert Watson #include <sys/param.h> 34718c8510SRobert Watson #include <sys/filedesc.h> 35718c8510SRobert Watson #include <sys/ipc.h> 36718c8510SRobert Watson #include <sys/mount.h> 37718c8510SRobert Watson #include <sys/proc.h> 38718c8510SRobert Watson #include <sys/socket.h> 39718c8510SRobert Watson #include <sys/socketvar.h> 40718c8510SRobert Watson #include <sys/protosw.h> 41718c8510SRobert Watson #include <sys/domain.h> 425619113cSRobert Watson #include <sys/sbuf.h> 43718c8510SRobert Watson #include <sys/systm.h> 44718c8510SRobert Watson #include <sys/un.h> 45718c8510SRobert Watson #include <sys/vnode.h> 46718c8510SRobert Watson 47718c8510SRobert Watson #include <netinet/in.h> 48718c8510SRobert Watson #include <netinet/in_pcb.h> 49718c8510SRobert Watson 50718c8510SRobert Watson #include <security/audit/audit.h> 51718c8510SRobert Watson #include <security/audit/audit_private.h> 52718c8510SRobert Watson 53718c8510SRobert Watson /* 54718c8510SRobert Watson * Calls to manipulate elements of the audit record structure from system 55d8c0f4dcSRobert Watson * call code. Macro wrappers will prevent this functions from being entered 56d8c0f4dcSRobert Watson * if auditing is disabled, avoiding the function call cost. We check the 57d8c0f4dcSRobert Watson * thread audit record pointer anyway, as the audit condition could change, 58d8c0f4dcSRobert Watson * and pre-selection may not have allocated an audit record for this event. 59718c8510SRobert Watson * 60718c8510SRobert Watson * XXXAUDIT: Should we assert, in each case, that this field of the record 61718c8510SRobert Watson * hasn't already been filled in? 62718c8510SRobert Watson */ 63718c8510SRobert Watson void 64718c8510SRobert Watson audit_arg_addr(void *addr) 65718c8510SRobert Watson { 66718c8510SRobert Watson struct kaudit_record *ar; 67718c8510SRobert Watson 68718c8510SRobert Watson ar = currecord(); 69718c8510SRobert Watson if (ar == NULL) 70718c8510SRobert Watson return; 71718c8510SRobert Watson 72718c8510SRobert Watson ar->k_ar.ar_arg_addr = addr; 73718c8510SRobert Watson ARG_SET_VALID(ar, ARG_ADDR); 74718c8510SRobert Watson } 75718c8510SRobert Watson 76718c8510SRobert Watson void 77718c8510SRobert Watson audit_arg_exit(int status, int retval) 78718c8510SRobert Watson { 79718c8510SRobert Watson struct kaudit_record *ar; 80718c8510SRobert Watson 81718c8510SRobert Watson ar = currecord(); 82718c8510SRobert Watson if (ar == NULL) 83718c8510SRobert Watson return; 84718c8510SRobert Watson 85718c8510SRobert Watson ar->k_ar.ar_arg_exitstatus = status; 86718c8510SRobert Watson ar->k_ar.ar_arg_exitretval = retval; 87718c8510SRobert Watson ARG_SET_VALID(ar, ARG_EXIT); 88718c8510SRobert Watson } 89718c8510SRobert Watson 90718c8510SRobert Watson void 91718c8510SRobert Watson audit_arg_len(int len) 92718c8510SRobert Watson { 93718c8510SRobert Watson struct kaudit_record *ar; 94718c8510SRobert Watson 95718c8510SRobert Watson ar = currecord(); 96718c8510SRobert Watson if (ar == NULL) 97718c8510SRobert Watson return; 98718c8510SRobert Watson 99718c8510SRobert Watson ar->k_ar.ar_arg_len = len; 100718c8510SRobert Watson ARG_SET_VALID(ar, ARG_LEN); 101718c8510SRobert Watson } 102718c8510SRobert Watson 103718c8510SRobert Watson void 104718c8510SRobert Watson audit_arg_fd(int fd) 105718c8510SRobert Watson { 106718c8510SRobert Watson struct kaudit_record *ar; 107718c8510SRobert Watson 108718c8510SRobert Watson ar = currecord(); 109718c8510SRobert Watson if (ar == NULL) 110718c8510SRobert Watson return; 111718c8510SRobert Watson 112718c8510SRobert Watson ar->k_ar.ar_arg_fd = fd; 113718c8510SRobert Watson ARG_SET_VALID(ar, ARG_FD); 114718c8510SRobert Watson } 115718c8510SRobert Watson 116718c8510SRobert Watson void 117718c8510SRobert Watson audit_arg_fflags(int fflags) 118718c8510SRobert Watson { 119718c8510SRobert Watson struct kaudit_record *ar; 120718c8510SRobert Watson 121718c8510SRobert Watson ar = currecord(); 122718c8510SRobert Watson if (ar == NULL) 123718c8510SRobert Watson return; 124718c8510SRobert Watson 125718c8510SRobert Watson ar->k_ar.ar_arg_fflags = fflags; 126718c8510SRobert Watson ARG_SET_VALID(ar, ARG_FFLAGS); 127718c8510SRobert Watson } 128718c8510SRobert Watson 129718c8510SRobert Watson void 130718c8510SRobert Watson audit_arg_gid(gid_t gid) 131718c8510SRobert Watson { 132718c8510SRobert Watson struct kaudit_record *ar; 133718c8510SRobert Watson 134718c8510SRobert Watson ar = currecord(); 135718c8510SRobert Watson if (ar == NULL) 136718c8510SRobert Watson return; 137718c8510SRobert Watson 138718c8510SRobert Watson ar->k_ar.ar_arg_gid = gid; 139718c8510SRobert Watson ARG_SET_VALID(ar, ARG_GID); 140718c8510SRobert Watson } 141718c8510SRobert Watson 142718c8510SRobert Watson void 143718c8510SRobert Watson audit_arg_uid(uid_t uid) 144718c8510SRobert Watson { 145718c8510SRobert Watson struct kaudit_record *ar; 146718c8510SRobert Watson 147718c8510SRobert Watson ar = currecord(); 148718c8510SRobert Watson if (ar == NULL) 149718c8510SRobert Watson return; 150718c8510SRobert Watson 151718c8510SRobert Watson ar->k_ar.ar_arg_uid = uid; 152718c8510SRobert Watson ARG_SET_VALID(ar, ARG_UID); 153718c8510SRobert Watson } 154718c8510SRobert Watson 155718c8510SRobert Watson void 156718c8510SRobert Watson audit_arg_egid(gid_t egid) 157718c8510SRobert Watson { 158718c8510SRobert Watson struct kaudit_record *ar; 159718c8510SRobert Watson 160718c8510SRobert Watson ar = currecord(); 161718c8510SRobert Watson if (ar == NULL) 162718c8510SRobert Watson return; 163718c8510SRobert Watson 164718c8510SRobert Watson ar->k_ar.ar_arg_egid = egid; 165718c8510SRobert Watson ARG_SET_VALID(ar, ARG_EGID); 166718c8510SRobert Watson } 167718c8510SRobert Watson 168718c8510SRobert Watson void 169718c8510SRobert Watson audit_arg_euid(uid_t euid) 170718c8510SRobert Watson { 171718c8510SRobert Watson struct kaudit_record *ar; 172718c8510SRobert Watson 173718c8510SRobert Watson ar = currecord(); 174718c8510SRobert Watson if (ar == NULL) 175718c8510SRobert Watson return; 176718c8510SRobert Watson 177718c8510SRobert Watson ar->k_ar.ar_arg_euid = euid; 178718c8510SRobert Watson ARG_SET_VALID(ar, ARG_EUID); 179718c8510SRobert Watson } 180718c8510SRobert Watson 181718c8510SRobert Watson void 182718c8510SRobert Watson audit_arg_rgid(gid_t rgid) 183718c8510SRobert Watson { 184718c8510SRobert Watson struct kaudit_record *ar; 185718c8510SRobert Watson 186718c8510SRobert Watson ar = currecord(); 187718c8510SRobert Watson if (ar == NULL) 188718c8510SRobert Watson return; 189718c8510SRobert Watson 190718c8510SRobert Watson ar->k_ar.ar_arg_rgid = rgid; 191718c8510SRobert Watson ARG_SET_VALID(ar, ARG_RGID); 192718c8510SRobert Watson } 193718c8510SRobert Watson 194718c8510SRobert Watson void 195718c8510SRobert Watson audit_arg_ruid(uid_t ruid) 196718c8510SRobert Watson { 197718c8510SRobert Watson struct kaudit_record *ar; 198718c8510SRobert Watson 199718c8510SRobert Watson ar = currecord(); 200718c8510SRobert Watson if (ar == NULL) 201718c8510SRobert Watson return; 202718c8510SRobert Watson 203718c8510SRobert Watson ar->k_ar.ar_arg_ruid = ruid; 204718c8510SRobert Watson ARG_SET_VALID(ar, ARG_RUID); 205718c8510SRobert Watson } 206718c8510SRobert Watson 207718c8510SRobert Watson void 208718c8510SRobert Watson audit_arg_sgid(gid_t sgid) 209718c8510SRobert Watson { 210718c8510SRobert Watson struct kaudit_record *ar; 211718c8510SRobert Watson 212718c8510SRobert Watson ar = currecord(); 213718c8510SRobert Watson if (ar == NULL) 214718c8510SRobert Watson return; 215718c8510SRobert Watson 216718c8510SRobert Watson ar->k_ar.ar_arg_sgid = sgid; 217718c8510SRobert Watson ARG_SET_VALID(ar, ARG_SGID); 218718c8510SRobert Watson } 219718c8510SRobert Watson 220718c8510SRobert Watson void 221718c8510SRobert Watson audit_arg_suid(uid_t suid) 222718c8510SRobert Watson { 223718c8510SRobert Watson struct kaudit_record *ar; 224718c8510SRobert Watson 225718c8510SRobert Watson ar = currecord(); 226718c8510SRobert Watson if (ar == NULL) 227718c8510SRobert Watson return; 228718c8510SRobert Watson 229718c8510SRobert Watson ar->k_ar.ar_arg_suid = suid; 230718c8510SRobert Watson ARG_SET_VALID(ar, ARG_SUID); 231718c8510SRobert Watson } 232718c8510SRobert Watson 233718c8510SRobert Watson void 234718c8510SRobert Watson audit_arg_groupset(gid_t *gidset, u_int gidset_size) 235718c8510SRobert Watson { 23659b622e6SRobert Watson u_int i; 237718c8510SRobert Watson struct kaudit_record *ar; 238718c8510SRobert Watson 239718c8510SRobert Watson ar = currecord(); 240718c8510SRobert Watson if (ar == NULL) 241718c8510SRobert Watson return; 242718c8510SRobert Watson 243718c8510SRobert Watson for (i = 0; i < gidset_size; i++) 244718c8510SRobert Watson ar->k_ar.ar_arg_groups.gidset[i] = gidset[i]; 245718c8510SRobert Watson ar->k_ar.ar_arg_groups.gidset_size = gidset_size; 246718c8510SRobert Watson ARG_SET_VALID(ar, ARG_GROUPSET); 247718c8510SRobert Watson } 248718c8510SRobert Watson 249718c8510SRobert Watson void 250718c8510SRobert Watson audit_arg_login(char *login) 251718c8510SRobert Watson { 252718c8510SRobert Watson struct kaudit_record *ar; 253718c8510SRobert Watson 254718c8510SRobert Watson ar = currecord(); 255718c8510SRobert Watson if (ar == NULL) 256718c8510SRobert Watson return; 257718c8510SRobert Watson 258718c8510SRobert Watson strlcpy(ar->k_ar.ar_arg_login, login, MAXLOGNAME); 259718c8510SRobert Watson ARG_SET_VALID(ar, ARG_LOGIN); 260718c8510SRobert Watson } 261718c8510SRobert Watson 262718c8510SRobert Watson void 263718c8510SRobert Watson audit_arg_ctlname(int *name, int namelen) 264718c8510SRobert Watson { 265718c8510SRobert Watson struct kaudit_record *ar; 266718c8510SRobert Watson 267718c8510SRobert Watson ar = currecord(); 268718c8510SRobert Watson if (ar == NULL) 269718c8510SRobert Watson return; 270718c8510SRobert Watson 271718c8510SRobert Watson bcopy(name, &ar->k_ar.ar_arg_ctlname, namelen * sizeof(int)); 272718c8510SRobert Watson ar->k_ar.ar_arg_len = namelen; 273718c8510SRobert Watson ARG_SET_VALID(ar, ARG_CTLNAME | ARG_LEN); 274718c8510SRobert Watson } 275718c8510SRobert Watson 276718c8510SRobert Watson void 277718c8510SRobert Watson audit_arg_mask(int mask) 278718c8510SRobert Watson { 279718c8510SRobert Watson struct kaudit_record *ar; 280718c8510SRobert Watson 281718c8510SRobert Watson ar = currecord(); 282718c8510SRobert Watson if (ar == NULL) 283718c8510SRobert Watson return; 284718c8510SRobert Watson 285718c8510SRobert Watson ar->k_ar.ar_arg_mask = mask; 286718c8510SRobert Watson ARG_SET_VALID(ar, ARG_MASK); 287718c8510SRobert Watson } 288718c8510SRobert Watson 289718c8510SRobert Watson void 290718c8510SRobert Watson audit_arg_mode(mode_t mode) 291718c8510SRobert Watson { 292718c8510SRobert Watson struct kaudit_record *ar; 293718c8510SRobert Watson 294718c8510SRobert Watson ar = currecord(); 295718c8510SRobert Watson if (ar == NULL) 296718c8510SRobert Watson return; 297718c8510SRobert Watson 298718c8510SRobert Watson ar->k_ar.ar_arg_mode = mode; 299718c8510SRobert Watson ARG_SET_VALID(ar, ARG_MODE); 300718c8510SRobert Watson } 301718c8510SRobert Watson 302718c8510SRobert Watson void 303718c8510SRobert Watson audit_arg_dev(int dev) 304718c8510SRobert Watson { 305718c8510SRobert Watson struct kaudit_record *ar; 306718c8510SRobert Watson 307718c8510SRobert Watson ar = currecord(); 308718c8510SRobert Watson if (ar == NULL) 309718c8510SRobert Watson return; 310718c8510SRobert Watson 311718c8510SRobert Watson ar->k_ar.ar_arg_dev = dev; 312718c8510SRobert Watson ARG_SET_VALID(ar, ARG_DEV); 313718c8510SRobert Watson } 314718c8510SRobert Watson 315718c8510SRobert Watson void 316718c8510SRobert Watson audit_arg_value(long value) 317718c8510SRobert Watson { 318718c8510SRobert Watson struct kaudit_record *ar; 319718c8510SRobert Watson 320718c8510SRobert Watson ar = currecord(); 321718c8510SRobert Watson if (ar == NULL) 322718c8510SRobert Watson return; 323718c8510SRobert Watson 324718c8510SRobert Watson ar->k_ar.ar_arg_value = value; 325718c8510SRobert Watson ARG_SET_VALID(ar, ARG_VALUE); 326718c8510SRobert Watson } 327718c8510SRobert Watson 328718c8510SRobert Watson void 329718c8510SRobert Watson audit_arg_owner(uid_t uid, gid_t gid) 330718c8510SRobert Watson { 331718c8510SRobert Watson struct kaudit_record *ar; 332718c8510SRobert Watson 333718c8510SRobert Watson ar = currecord(); 334718c8510SRobert Watson if (ar == NULL) 335718c8510SRobert Watson return; 336718c8510SRobert Watson 337718c8510SRobert Watson ar->k_ar.ar_arg_uid = uid; 338718c8510SRobert Watson ar->k_ar.ar_arg_gid = gid; 339718c8510SRobert Watson ARG_SET_VALID(ar, ARG_UID | ARG_GID); 340718c8510SRobert Watson } 341718c8510SRobert Watson 342718c8510SRobert Watson void 343718c8510SRobert Watson audit_arg_pid(pid_t pid) 344718c8510SRobert Watson { 345718c8510SRobert Watson struct kaudit_record *ar; 346718c8510SRobert Watson 347718c8510SRobert Watson ar = currecord(); 348718c8510SRobert Watson if (ar == NULL) 349718c8510SRobert Watson return; 350718c8510SRobert Watson 351718c8510SRobert Watson ar->k_ar.ar_arg_pid = pid; 352718c8510SRobert Watson ARG_SET_VALID(ar, ARG_PID); 353718c8510SRobert Watson } 354718c8510SRobert Watson 355718c8510SRobert Watson void 356718c8510SRobert Watson audit_arg_process(struct proc *p) 357718c8510SRobert Watson { 358718c8510SRobert Watson struct kaudit_record *ar; 359e6870c95SRobert Watson struct ucred *cred; 360718c8510SRobert Watson 361814fe9e9SRobert Watson KASSERT(p != NULL, ("audit_arg_process: p == NULL")); 362814fe9e9SRobert Watson 363814fe9e9SRobert Watson PROC_LOCK_ASSERT(p, MA_OWNED); 364814fe9e9SRobert Watson 365718c8510SRobert Watson ar = currecord(); 366814fe9e9SRobert Watson if (ar == NULL) 367718c8510SRobert Watson return; 368718c8510SRobert Watson 369e6870c95SRobert Watson cred = p->p_ucred; 370e6870c95SRobert Watson ar->k_ar.ar_arg_auid = cred->cr_audit.ai_auid; 371e6870c95SRobert Watson ar->k_ar.ar_arg_euid = cred->cr_uid; 372e6870c95SRobert Watson ar->k_ar.ar_arg_egid = cred->cr_groups[0]; 373e6870c95SRobert Watson ar->k_ar.ar_arg_ruid = cred->cr_ruid; 374e6870c95SRobert Watson ar->k_ar.ar_arg_rgid = cred->cr_rgid; 375e6870c95SRobert Watson ar->k_ar.ar_arg_asid = cred->cr_audit.ai_asid; 376e6870c95SRobert Watson ar->k_ar.ar_arg_termid_addr = cred->cr_audit.ai_termid; 3775619113cSRobert Watson ar->k_ar.ar_arg_pid = p->p_pid; 378718c8510SRobert Watson ARG_SET_VALID(ar, ARG_AUID | ARG_EUID | ARG_EGID | ARG_RUID | 379f0cbfcc4SChristian S.J. Peron ARG_RGID | ARG_ASID | ARG_TERMID_ADDR | ARG_PID | ARG_PROCESS); 380718c8510SRobert Watson } 381718c8510SRobert Watson 382718c8510SRobert Watson void 383718c8510SRobert Watson audit_arg_signum(u_int signum) 384718c8510SRobert Watson { 385718c8510SRobert Watson struct kaudit_record *ar; 386718c8510SRobert Watson 387718c8510SRobert Watson ar = currecord(); 388718c8510SRobert Watson if (ar == NULL) 389718c8510SRobert Watson return; 390718c8510SRobert Watson 391718c8510SRobert Watson ar->k_ar.ar_arg_signum = signum; 392718c8510SRobert Watson ARG_SET_VALID(ar, ARG_SIGNUM); 393718c8510SRobert Watson } 394718c8510SRobert Watson 395718c8510SRobert Watson void 396718c8510SRobert Watson audit_arg_socket(int sodomain, int sotype, int soprotocol) 397718c8510SRobert Watson { 398718c8510SRobert Watson struct kaudit_record *ar; 399718c8510SRobert Watson 400718c8510SRobert Watson ar = currecord(); 401718c8510SRobert Watson if (ar == NULL) 402718c8510SRobert Watson return; 403718c8510SRobert Watson 404718c8510SRobert Watson ar->k_ar.ar_arg_sockinfo.so_domain = sodomain; 405718c8510SRobert Watson ar->k_ar.ar_arg_sockinfo.so_type = sotype; 406718c8510SRobert Watson ar->k_ar.ar_arg_sockinfo.so_protocol = soprotocol; 407718c8510SRobert Watson ARG_SET_VALID(ar, ARG_SOCKINFO); 408718c8510SRobert Watson } 409718c8510SRobert Watson 410718c8510SRobert Watson void 411814fe9e9SRobert Watson audit_arg_sockaddr(struct thread *td, struct sockaddr *sa) 412718c8510SRobert Watson { 413718c8510SRobert Watson struct kaudit_record *ar; 414718c8510SRobert Watson 415814fe9e9SRobert Watson KASSERT(td != NULL, ("audit_arg_sockaddr: td == NULL")); 416814fe9e9SRobert Watson KASSERT(sa != NULL, ("audit_arg_sockaddr: sa == NULL")); 417814fe9e9SRobert Watson 418718c8510SRobert Watson ar = currecord(); 419814fe9e9SRobert Watson if (ar == NULL) 420718c8510SRobert Watson return; 421718c8510SRobert Watson 422130b1468SChristian S.J. Peron bcopy(sa, &ar->k_ar.ar_arg_sockaddr, sa->sa_len); 423814fe9e9SRobert Watson switch (sa->sa_family) { 424718c8510SRobert Watson case AF_INET: 425718c8510SRobert Watson ARG_SET_VALID(ar, ARG_SADDRINET); 426718c8510SRobert Watson break; 427718c8510SRobert Watson 428718c8510SRobert Watson case AF_INET6: 429718c8510SRobert Watson ARG_SET_VALID(ar, ARG_SADDRINET6); 430718c8510SRobert Watson break; 431718c8510SRobert Watson 432718c8510SRobert Watson case AF_UNIX: 433814fe9e9SRobert Watson audit_arg_upath(td, ((struct sockaddr_un *)sa)->sun_path, 434718c8510SRobert Watson ARG_UPATH1); 435718c8510SRobert Watson ARG_SET_VALID(ar, ARG_SADDRUNIX); 436718c8510SRobert Watson break; 437718c8510SRobert Watson /* XXXAUDIT: default:? */ 438718c8510SRobert Watson } 439718c8510SRobert Watson } 440718c8510SRobert Watson 441718c8510SRobert Watson void 442718c8510SRobert Watson audit_arg_auid(uid_t auid) 443718c8510SRobert Watson { 444718c8510SRobert Watson struct kaudit_record *ar; 445718c8510SRobert Watson 446718c8510SRobert Watson ar = currecord(); 447718c8510SRobert Watson if (ar == NULL) 448718c8510SRobert Watson return; 449718c8510SRobert Watson 450718c8510SRobert Watson ar->k_ar.ar_arg_auid = auid; 451718c8510SRobert Watson ARG_SET_VALID(ar, ARG_AUID); 452718c8510SRobert Watson } 453718c8510SRobert Watson 454718c8510SRobert Watson void 455718c8510SRobert Watson audit_arg_auditinfo(struct auditinfo *au_info) 456718c8510SRobert Watson { 457718c8510SRobert Watson struct kaudit_record *ar; 458718c8510SRobert Watson 459718c8510SRobert Watson ar = currecord(); 460718c8510SRobert Watson if (ar == NULL) 461718c8510SRobert Watson return; 462718c8510SRobert Watson 463718c8510SRobert Watson ar->k_ar.ar_arg_auid = au_info->ai_auid; 464718c8510SRobert Watson ar->k_ar.ar_arg_asid = au_info->ai_asid; 465718c8510SRobert Watson ar->k_ar.ar_arg_amask.am_success = au_info->ai_mask.am_success; 466718c8510SRobert Watson ar->k_ar.ar_arg_amask.am_failure = au_info->ai_mask.am_failure; 467718c8510SRobert Watson ar->k_ar.ar_arg_termid.port = au_info->ai_termid.port; 468718c8510SRobert Watson ar->k_ar.ar_arg_termid.machine = au_info->ai_termid.machine; 469718c8510SRobert Watson ARG_SET_VALID(ar, ARG_AUID | ARG_ASID | ARG_AMASK | ARG_TERMID); 470718c8510SRobert Watson } 471718c8510SRobert Watson 472718c8510SRobert Watson void 473cac465aaSChristian S.J. Peron audit_arg_auditinfo_addr(struct auditinfo_addr *au_info) 474cac465aaSChristian S.J. Peron { 475cac465aaSChristian S.J. Peron struct kaudit_record *ar; 476cac465aaSChristian S.J. Peron 477cac465aaSChristian S.J. Peron ar = currecord(); 478cac465aaSChristian S.J. Peron if (ar == NULL) 479cac465aaSChristian S.J. Peron return; 480cac465aaSChristian S.J. Peron 481cac465aaSChristian S.J. Peron ar->k_ar.ar_arg_auid = au_info->ai_auid; 482cac465aaSChristian S.J. Peron ar->k_ar.ar_arg_asid = au_info->ai_asid; 483cac465aaSChristian S.J. Peron ar->k_ar.ar_arg_amask.am_success = au_info->ai_mask.am_success; 484cac465aaSChristian S.J. Peron ar->k_ar.ar_arg_amask.am_failure = au_info->ai_mask.am_failure; 485cac465aaSChristian S.J. Peron ar->k_ar.ar_arg_termid_addr.at_type = au_info->ai_termid.at_type; 486cac465aaSChristian S.J. Peron ar->k_ar.ar_arg_termid_addr.at_port = au_info->ai_termid.at_port; 487cac465aaSChristian S.J. Peron ar->k_ar.ar_arg_termid_addr.at_addr[0] = au_info->ai_termid.at_addr[0]; 488cac465aaSChristian S.J. Peron ar->k_ar.ar_arg_termid_addr.at_addr[1] = au_info->ai_termid.at_addr[1]; 489cac465aaSChristian S.J. Peron ar->k_ar.ar_arg_termid_addr.at_addr[2] = au_info->ai_termid.at_addr[2]; 490cac465aaSChristian S.J. Peron ar->k_ar.ar_arg_termid_addr.at_addr[3] = au_info->ai_termid.at_addr[3]; 491cac465aaSChristian S.J. Peron ARG_SET_VALID(ar, ARG_AUID | ARG_ASID | ARG_AMASK | ARG_TERMID_ADDR); 492cac465aaSChristian S.J. Peron } 493cac465aaSChristian S.J. Peron 494cac465aaSChristian S.J. Peron void 495718c8510SRobert Watson audit_arg_text(char *text) 496718c8510SRobert Watson { 497718c8510SRobert Watson struct kaudit_record *ar; 498718c8510SRobert Watson 499814fe9e9SRobert Watson KASSERT(text != NULL, ("audit_arg_text: text == NULL")); 500814fe9e9SRobert Watson 501718c8510SRobert Watson ar = currecord(); 502718c8510SRobert Watson if (ar == NULL) 503718c8510SRobert Watson return; 504718c8510SRobert Watson 505718c8510SRobert Watson /* Invalidate the text string */ 506718c8510SRobert Watson ar->k_ar.ar_valid_arg &= (ARG_ALL ^ ARG_TEXT); 507718c8510SRobert Watson 508718c8510SRobert Watson if (ar->k_ar.ar_arg_text == NULL) 509718c8510SRobert Watson ar->k_ar.ar_arg_text = malloc(MAXPATHLEN, M_AUDITTEXT, 510718c8510SRobert Watson M_WAITOK); 511718c8510SRobert Watson 512718c8510SRobert Watson strncpy(ar->k_ar.ar_arg_text, text, MAXPATHLEN); 513718c8510SRobert Watson ARG_SET_VALID(ar, ARG_TEXT); 514718c8510SRobert Watson } 515718c8510SRobert Watson 516718c8510SRobert Watson void 517718c8510SRobert Watson audit_arg_cmd(int cmd) 518718c8510SRobert Watson { 519718c8510SRobert Watson struct kaudit_record *ar; 520718c8510SRobert Watson 521718c8510SRobert Watson ar = currecord(); 522718c8510SRobert Watson if (ar == NULL) 523718c8510SRobert Watson return; 524718c8510SRobert Watson 525718c8510SRobert Watson ar->k_ar.ar_arg_cmd = cmd; 526718c8510SRobert Watson ARG_SET_VALID(ar, ARG_CMD); 527718c8510SRobert Watson } 528718c8510SRobert Watson 529718c8510SRobert Watson void 530718c8510SRobert Watson audit_arg_svipc_cmd(int cmd) 531718c8510SRobert Watson { 532718c8510SRobert Watson struct kaudit_record *ar; 533718c8510SRobert Watson 534718c8510SRobert Watson ar = currecord(); 535718c8510SRobert Watson if (ar == NULL) 536718c8510SRobert Watson return; 537718c8510SRobert Watson 538718c8510SRobert Watson ar->k_ar.ar_arg_svipc_cmd = cmd; 539718c8510SRobert Watson ARG_SET_VALID(ar, ARG_SVIPC_CMD); 540718c8510SRobert Watson } 541718c8510SRobert Watson 542718c8510SRobert Watson void 543718c8510SRobert Watson audit_arg_svipc_perm(struct ipc_perm *perm) 544718c8510SRobert Watson { 545718c8510SRobert Watson struct kaudit_record *ar; 546718c8510SRobert Watson 547718c8510SRobert Watson ar = currecord(); 548718c8510SRobert Watson if (ar == NULL) 549718c8510SRobert Watson return; 550718c8510SRobert Watson 551718c8510SRobert Watson bcopy(perm, &ar->k_ar.ar_arg_svipc_perm, 552718c8510SRobert Watson sizeof(ar->k_ar.ar_arg_svipc_perm)); 553718c8510SRobert Watson ARG_SET_VALID(ar, ARG_SVIPC_PERM); 554718c8510SRobert Watson } 555718c8510SRobert Watson 556718c8510SRobert Watson void 557718c8510SRobert Watson audit_arg_svipc_id(int id) 558718c8510SRobert Watson { 559718c8510SRobert Watson struct kaudit_record *ar; 560718c8510SRobert Watson 561718c8510SRobert Watson ar = currecord(); 562718c8510SRobert Watson if (ar == NULL) 563718c8510SRobert Watson return; 564718c8510SRobert Watson 565718c8510SRobert Watson ar->k_ar.ar_arg_svipc_id = id; 566718c8510SRobert Watson ARG_SET_VALID(ar, ARG_SVIPC_ID); 567718c8510SRobert Watson } 568718c8510SRobert Watson 569718c8510SRobert Watson void 570718c8510SRobert Watson audit_arg_svipc_addr(void * addr) 571718c8510SRobert Watson { 572718c8510SRobert Watson struct kaudit_record *ar; 573718c8510SRobert Watson 574718c8510SRobert Watson ar = currecord(); 575718c8510SRobert Watson if (ar == NULL) 576718c8510SRobert Watson return; 577718c8510SRobert Watson 578718c8510SRobert Watson ar->k_ar.ar_arg_svipc_addr = addr; 579718c8510SRobert Watson ARG_SET_VALID(ar, ARG_SVIPC_ADDR); 580718c8510SRobert Watson } 581718c8510SRobert Watson 582718c8510SRobert Watson void 583718c8510SRobert Watson audit_arg_posix_ipc_perm(uid_t uid, gid_t gid, mode_t mode) 584718c8510SRobert Watson { 585718c8510SRobert Watson struct kaudit_record *ar; 586718c8510SRobert Watson 587718c8510SRobert Watson ar = currecord(); 588718c8510SRobert Watson if (ar == NULL) 589718c8510SRobert Watson return; 590718c8510SRobert Watson 591718c8510SRobert Watson ar->k_ar.ar_arg_pipc_perm.pipc_uid = uid; 592718c8510SRobert Watson ar->k_ar.ar_arg_pipc_perm.pipc_gid = gid; 593718c8510SRobert Watson ar->k_ar.ar_arg_pipc_perm.pipc_mode = mode; 594718c8510SRobert Watson ARG_SET_VALID(ar, ARG_POSIX_IPC_PERM); 595718c8510SRobert Watson } 596718c8510SRobert Watson 597718c8510SRobert Watson void 598718c8510SRobert Watson audit_arg_auditon(union auditon_udata *udata) 599718c8510SRobert Watson { 600718c8510SRobert Watson struct kaudit_record *ar; 601718c8510SRobert Watson 602718c8510SRobert Watson ar = currecord(); 603718c8510SRobert Watson if (ar == NULL) 604718c8510SRobert Watson return; 605718c8510SRobert Watson 606718c8510SRobert Watson bcopy((void *)udata, &ar->k_ar.ar_arg_auditon, 607718c8510SRobert Watson sizeof(ar->k_ar.ar_arg_auditon)); 608718c8510SRobert Watson ARG_SET_VALID(ar, ARG_AUDITON); 609718c8510SRobert Watson } 610718c8510SRobert Watson 611718c8510SRobert Watson /* 612718c8510SRobert Watson * Audit information about a file, either the file's vnode info, or its 613718c8510SRobert Watson * socket address info. 614718c8510SRobert Watson */ 615718c8510SRobert Watson void 616718c8510SRobert Watson audit_arg_file(struct proc *p, struct file *fp) 617718c8510SRobert Watson { 618718c8510SRobert Watson struct kaudit_record *ar; 619718c8510SRobert Watson struct socket *so; 620718c8510SRobert Watson struct inpcb *pcb; 621718c8510SRobert Watson struct vnode *vp; 622718c8510SRobert Watson int vfslocked; 623718c8510SRobert Watson 624814fe9e9SRobert Watson ar = currecord(); 625814fe9e9SRobert Watson if (ar == NULL) 626814fe9e9SRobert Watson return; 627814fe9e9SRobert Watson 628718c8510SRobert Watson switch (fp->f_type) { 629718c8510SRobert Watson case DTYPE_VNODE: 630718c8510SRobert Watson case DTYPE_FIFO: 631718c8510SRobert Watson /* 632718c8510SRobert Watson * XXXAUDIT: Only possibly to record as first vnode? 633718c8510SRobert Watson */ 634718c8510SRobert Watson vp = fp->f_vnode; 635718c8510SRobert Watson vfslocked = VFS_LOCK_GIANT(vp->v_mount); 636927edcc9SJohn Baldwin vn_lock(vp, LK_SHARED | LK_RETRY); 637718c8510SRobert Watson audit_arg_vnode(vp, ARG_VNODE1); 63822db15c0SAttilio Rao VOP_UNLOCK(vp, 0); 639718c8510SRobert Watson VFS_UNLOCK_GIANT(vfslocked); 640718c8510SRobert Watson break; 641718c8510SRobert Watson 642718c8510SRobert Watson case DTYPE_SOCKET: 643718c8510SRobert Watson so = (struct socket *)fp->f_data; 644718c8510SRobert Watson if (INP_CHECK_SOCKAF(so, PF_INET)) { 645a1f3b839SRobert Watson SOCK_LOCK(so); 646718c8510SRobert Watson ar->k_ar.ar_arg_sockinfo.so_type = 647718c8510SRobert Watson so->so_type; 648718c8510SRobert Watson ar->k_ar.ar_arg_sockinfo.so_domain = 649718c8510SRobert Watson INP_SOCKAF(so); 650718c8510SRobert Watson ar->k_ar.ar_arg_sockinfo.so_protocol = 651718c8510SRobert Watson so->so_proto->pr_protocol; 652a1f3b839SRobert Watson SOCK_UNLOCK(so); 653718c8510SRobert Watson pcb = (struct inpcb *)so->so_pcb; 6541a46aa80SRobert Watson INP_RLOCK(pcb); 655718c8510SRobert Watson ar->k_ar.ar_arg_sockinfo.so_raddr = 656718c8510SRobert Watson pcb->inp_faddr.s_addr; 657718c8510SRobert Watson ar->k_ar.ar_arg_sockinfo.so_laddr = 658718c8510SRobert Watson pcb->inp_laddr.s_addr; 659718c8510SRobert Watson ar->k_ar.ar_arg_sockinfo.so_rport = 660718c8510SRobert Watson pcb->inp_fport; 661718c8510SRobert Watson ar->k_ar.ar_arg_sockinfo.so_lport = 662718c8510SRobert Watson pcb->inp_lport; 6631a46aa80SRobert Watson INP_RUNLOCK(pcb); 664718c8510SRobert Watson ARG_SET_VALID(ar, ARG_SOCKINFO); 665718c8510SRobert Watson } 666718c8510SRobert Watson break; 667718c8510SRobert Watson 668718c8510SRobert Watson default: 669718c8510SRobert Watson /* XXXAUDIT: else? */ 670718c8510SRobert Watson break; 671718c8510SRobert Watson } 672718c8510SRobert Watson } 673718c8510SRobert Watson 674718c8510SRobert Watson /* 675718c8510SRobert Watson * Store a path as given by the user process for auditing into the audit 676871499feSRobert Watson * record stored on the user thread. This function will allocate the memory 677c2f027ffSRobert Watson * to store the path info if not already available. This memory will be 678c2f027ffSRobert Watson * freed when the audit record is freed. 679718c8510SRobert Watson * 680718c8510SRobert Watson * XXXAUDIT: Possibly assert that the memory isn't already allocated? 681718c8510SRobert Watson */ 682718c8510SRobert Watson void 683718c8510SRobert Watson audit_arg_upath(struct thread *td, char *upath, u_int64_t flag) 684718c8510SRobert Watson { 685718c8510SRobert Watson struct kaudit_record *ar; 686718c8510SRobert Watson char **pathp; 687718c8510SRobert Watson 688814fe9e9SRobert Watson KASSERT(td != NULL, ("audit_arg_upath: td == NULL")); 689814fe9e9SRobert Watson KASSERT(upath != NULL, ("audit_arg_upath: upath == NULL")); 690814fe9e9SRobert Watson 691814fe9e9SRobert Watson ar = currecord(); 692814fe9e9SRobert Watson if (ar == NULL) 693814fe9e9SRobert Watson return; 694718c8510SRobert Watson 695718c8510SRobert Watson KASSERT((flag == ARG_UPATH1) || (flag == ARG_UPATH2), 696fac3e318SRobert Watson ("audit_arg_upath: flag %llu", (unsigned long long)flag)); 697718c8510SRobert Watson KASSERT((flag != ARG_UPATH1) || (flag != ARG_UPATH2), 698fac3e318SRobert Watson ("audit_arg_upath: flag %llu", (unsigned long long)flag)); 699718c8510SRobert Watson 700718c8510SRobert Watson if (flag == ARG_UPATH1) 701718c8510SRobert Watson pathp = &ar->k_ar.ar_arg_upath1; 702718c8510SRobert Watson else 703718c8510SRobert Watson pathp = &ar->k_ar.ar_arg_upath2; 704718c8510SRobert Watson 705718c8510SRobert Watson if (*pathp == NULL) 706718c8510SRobert Watson *pathp = malloc(MAXPATHLEN, M_AUDITPATH, M_WAITOK); 707718c8510SRobert Watson 708303d3f35SRobert Watson audit_canon_path(td, upath, *pathp); 709718c8510SRobert Watson 710718c8510SRobert Watson ARG_SET_VALID(ar, flag); 711718c8510SRobert Watson } 712718c8510SRobert Watson 713718c8510SRobert Watson /* 714718c8510SRobert Watson * Function to save the path and vnode attr information into the audit 715718c8510SRobert Watson * record. 716718c8510SRobert Watson * 717718c8510SRobert Watson * It is assumed that the caller will hold any vnode locks necessary to 718718c8510SRobert Watson * perform a VOP_GETATTR() on the passed vnode. 719718c8510SRobert Watson * 720d8c0f4dcSRobert Watson * XXX: The attr code is very similar to vfs_vnops.c:vn_stat(), but always 721d8c0f4dcSRobert Watson * provides access to the generation number as we need that to construct the 722d8c0f4dcSRobert Watson * BSM file ID. 723d8c0f4dcSRobert Watson * 724d8c0f4dcSRobert Watson * XXX: We should accept the process argument from the caller, since it's 725d8c0f4dcSRobert Watson * very likely they already have a reference. 726d8c0f4dcSRobert Watson * 727718c8510SRobert Watson * XXX: Error handling in this function is poor. 728718c8510SRobert Watson * 729718c8510SRobert Watson * XXXAUDIT: Possibly KASSERT the path pointer is NULL? 730718c8510SRobert Watson */ 731718c8510SRobert Watson void 732718c8510SRobert Watson audit_arg_vnode(struct vnode *vp, u_int64_t flags) 733718c8510SRobert Watson { 734718c8510SRobert Watson struct kaudit_record *ar; 735718c8510SRobert Watson struct vattr vattr; 736718c8510SRobert Watson int error; 737718c8510SRobert Watson struct vnode_au_info *vnp; 738718c8510SRobert Watson 739814fe9e9SRobert Watson KASSERT(vp != NULL, ("audit_arg_vnode: vp == NULL")); 740814fe9e9SRobert Watson KASSERT((flags == ARG_VNODE1) || (flags == ARG_VNODE2), 741814fe9e9SRobert Watson ("audit_arg_vnode: flags %jd", (intmax_t)flags)); 742718c8510SRobert Watson 743718c8510SRobert Watson /* 744718c8510SRobert Watson * Assume that if the caller is calling audit_arg_vnode() on a 745718c8510SRobert Watson * non-MPSAFE vnode, then it will have acquired Giant. 746718c8510SRobert Watson */ 747718c8510SRobert Watson VFS_ASSERT_GIANT(vp->v_mount); 748718c8510SRobert Watson ASSERT_VOP_LOCKED(vp, "audit_arg_vnode"); 749718c8510SRobert Watson 750718c8510SRobert Watson ar = currecord(); 751871499feSRobert Watson if (ar == NULL) 752718c8510SRobert Watson return; 753718c8510SRobert Watson 754718c8510SRobert Watson /* 755718c8510SRobert Watson * XXXAUDIT: The below clears, and then resets the flags for valid 756718c8510SRobert Watson * arguments. Ideally, either the new vnode is used, or the old one 757718c8510SRobert Watson * would be. 758718c8510SRobert Watson */ 759718c8510SRobert Watson if (flags & ARG_VNODE1) { 760718c8510SRobert Watson ar->k_ar.ar_valid_arg &= (ARG_ALL ^ ARG_VNODE1); 761718c8510SRobert Watson vnp = &ar->k_ar.ar_arg_vnode1; 762718c8510SRobert Watson } else { 763718c8510SRobert Watson ar->k_ar.ar_valid_arg &= (ARG_ALL ^ ARG_VNODE2); 764718c8510SRobert Watson vnp = &ar->k_ar.ar_arg_vnode2; 765718c8510SRobert Watson } 766718c8510SRobert Watson 7670359a12eSAttilio Rao error = VOP_GETATTR(vp, &vattr, curthread->td_ucred); 768718c8510SRobert Watson if (error) { 769718c8510SRobert Watson /* XXX: How to handle this case? */ 770718c8510SRobert Watson return; 771718c8510SRobert Watson } 772718c8510SRobert Watson 773718c8510SRobert Watson vnp->vn_mode = vattr.va_mode; 774718c8510SRobert Watson vnp->vn_uid = vattr.va_uid; 775718c8510SRobert Watson vnp->vn_gid = vattr.va_gid; 776718c8510SRobert Watson vnp->vn_dev = vattr.va_rdev; 777718c8510SRobert Watson vnp->vn_fsid = vattr.va_fsid; 778718c8510SRobert Watson vnp->vn_fileid = vattr.va_fileid; 779718c8510SRobert Watson vnp->vn_gen = vattr.va_gen; 780718c8510SRobert Watson if (flags & ARG_VNODE1) 781718c8510SRobert Watson ARG_SET_VALID(ar, ARG_VNODE1); 782718c8510SRobert Watson else 783718c8510SRobert Watson ARG_SET_VALID(ar, ARG_VNODE2); 784718c8510SRobert Watson } 785718c8510SRobert Watson 786718c8510SRobert Watson /* 787ae1078d6SWayne Salamon * Audit the argument strings passed to exec. 788ae1078d6SWayne Salamon */ 789ae1078d6SWayne Salamon void 790ae1078d6SWayne Salamon audit_arg_argv(char *argv, int argc, int length) 791ae1078d6SWayne Salamon { 792ae1078d6SWayne Salamon struct kaudit_record *ar; 793ae1078d6SWayne Salamon 794ae1078d6SWayne Salamon if (audit_argv == 0) 795ae1078d6SWayne Salamon return; 796ae1078d6SWayne Salamon 797ae1078d6SWayne Salamon ar = currecord(); 798ae1078d6SWayne Salamon if (ar == NULL) 799ae1078d6SWayne Salamon return; 800ae1078d6SWayne Salamon 801ae1078d6SWayne Salamon ar->k_ar.ar_arg_argv = malloc(length, M_AUDITTEXT, M_WAITOK); 802ae1078d6SWayne Salamon bcopy(argv, ar->k_ar.ar_arg_argv, length); 803ae1078d6SWayne Salamon ar->k_ar.ar_arg_argc = argc; 804ae1078d6SWayne Salamon ARG_SET_VALID(ar, ARG_ARGV); 805ae1078d6SWayne Salamon } 806ae1078d6SWayne Salamon 807ae1078d6SWayne Salamon /* 808ae1078d6SWayne Salamon * Audit the environment strings passed to exec. 809ae1078d6SWayne Salamon */ 810ae1078d6SWayne Salamon void 811ae1078d6SWayne Salamon audit_arg_envv(char *envv, int envc, int length) 812ae1078d6SWayne Salamon { 813ae1078d6SWayne Salamon struct kaudit_record *ar; 814ae1078d6SWayne Salamon 815ae1078d6SWayne Salamon if (audit_arge == 0) 816ae1078d6SWayne Salamon return; 817ae1078d6SWayne Salamon 818ae1078d6SWayne Salamon ar = currecord(); 819ae1078d6SWayne Salamon if (ar == NULL) 820ae1078d6SWayne Salamon return; 821ae1078d6SWayne Salamon 822ae1078d6SWayne Salamon ar->k_ar.ar_arg_envv = malloc(length, M_AUDITTEXT, M_WAITOK); 823ae1078d6SWayne Salamon bcopy(envv, ar->k_ar.ar_arg_envv, length); 824ae1078d6SWayne Salamon ar->k_ar.ar_arg_envc = envc; 825ae1078d6SWayne Salamon ARG_SET_VALID(ar, ARG_ENVV); 826ae1078d6SWayne Salamon } 827ae1078d6SWayne Salamon 828ae1078d6SWayne Salamon /* 829871499feSRobert Watson * The close() system call uses it's own audit call to capture the path/vnode 830871499feSRobert Watson * information because those pieces are not easily obtained within the system 831871499feSRobert Watson * call itself. 832718c8510SRobert Watson */ 833718c8510SRobert Watson void 834718c8510SRobert Watson audit_sysclose(struct thread *td, int fd) 835718c8510SRobert Watson { 836814fe9e9SRobert Watson struct kaudit_record *ar; 837718c8510SRobert Watson struct vnode *vp; 838718c8510SRobert Watson struct file *fp; 839718c8510SRobert Watson int vfslocked; 840718c8510SRobert Watson 841814fe9e9SRobert Watson KASSERT(td != NULL, ("audit_sysclose: td == NULL")); 842814fe9e9SRobert Watson 843814fe9e9SRobert Watson ar = currecord(); 844814fe9e9SRobert Watson if (ar == NULL) 845814fe9e9SRobert Watson return; 846814fe9e9SRobert Watson 847718c8510SRobert Watson audit_arg_fd(fd); 848718c8510SRobert Watson 849718c8510SRobert Watson if (getvnode(td->td_proc->p_fd, fd, &fp) != 0) 850718c8510SRobert Watson return; 851718c8510SRobert Watson 852718c8510SRobert Watson vp = fp->f_vnode; 853718c8510SRobert Watson vfslocked = VFS_LOCK_GIANT(vp->v_mount); 854927edcc9SJohn Baldwin vn_lock(vp, LK_SHARED | LK_RETRY); 855718c8510SRobert Watson audit_arg_vnode(vp, ARG_VNODE1); 85622db15c0SAttilio Rao VOP_UNLOCK(vp, 0); 857718c8510SRobert Watson VFS_UNLOCK_GIANT(vfslocked); 858718c8510SRobert Watson fdrop(fp, td); 859718c8510SRobert Watson } 860