LCOV - code coverage report
Current view: top level - source3/modules - vfs_full_audit.c (source / functions) Hit Total Coverage
Test: coverage report for master 2f515e9b Lines: 554 965 57.4 %
Date: 2024-04-21 15:09:00 Functions: 86 116 74.1 %

          Line data    Source code
       1             : /*
       2             :  * Auditing VFS module for samba.  Log selected file operations to syslog
       3             :  * facility.
       4             :  *
       5             :  * Copyright (C) Tim Potter, 1999-2000
       6             :  * Copyright (C) Alexander Bokovoy, 2002
       7             :  * Copyright (C) John H Terpstra, 2003
       8             :  * Copyright (C) Stefan (metze) Metzmacher, 2003
       9             :  * Copyright (C) Volker Lendecke, 2004
      10             :  *
      11             :  * This program is free software; you can redistribute it and/or modify
      12             :  * it under the terms of the GNU General Public License as published by
      13             :  * the Free Software Foundation; either version 3 of the License, or
      14             :  * (at your option) any later version.
      15             :  *
      16             :  * This program is distributed in the hope that it will be useful,
      17             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      18             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      19             :  * GNU General Public License for more details.
      20             :  *
      21             :  * You should have received a copy of the GNU General Public License
      22             :  * along with this program; if not, see <http://www.gnu.org/licenses/>.
      23             :  */
      24             : 
      25             : /*
      26             :  * This module implements parseable logging for all Samba VFS operations.
      27             :  *
      28             :  * You use it as follows:
      29             :  *
      30             :  * [tmp]
      31             :  * path = /tmp
      32             :  * vfs objects = full_audit
      33             :  * full_audit:prefix = %u|%I
      34             :  * full_audit:success = open opendir create_file
      35             :  * full_audit:failure = all
      36             :  *
      37             :  * vfs op can be "all" which means log all operations.
      38             :  * vfs op can be "none" which means no logging.
      39             :  *
      40             :  * This leads to syslog entries of the form:
      41             :  * smbd_audit: nobody|192.168.234.1|opendir|ok|/tmp
      42             :  * smbd_audit: nobody|192.168.234.1|create_file|fail (No such file or directory)|0x1|file|open|/ts/doesNotExist
      43             :  * smbd_audit: nobody|192.168.234.1|open|ok|w|/tmp/file.txt
      44             :  * smbd_audit: nobody|192.168.234.1|create_file|ok|0x3|file|open|/tmp/file.txt
      45             :  *
      46             :  * where "nobody" is the connected username and "192.168.234.1" is the
      47             :  * client's IP address.
      48             :  *
      49             :  * Options:
      50             :  *
      51             :  * prefix: A macro expansion template prepended to the syslog entry.
      52             :  *
      53             :  * success: A list of VFS operations for which a successful completion should
      54             :  * be logged. Defaults to no logging at all. The special operation "all" logs
      55             :  * - you guessed it - everything.
      56             :  *
      57             :  * failure: A list of VFS operations for which failure to complete should be
      58             :  * logged. Defaults to logging everything.
      59             :  */
      60             : 
      61             : 
      62             : #include "includes.h"
      63             : #include "system/filesys.h"
      64             : #include "system/syslog.h"
      65             : #include "smbd/smbd.h"
      66             : #include "../librpc/gen_ndr/ndr_netlogon.h"
      67             : #include "auth.h"
      68             : #include "ntioctl.h"
      69             : #include "lib/param/loadparm.h"
      70             : #include "lib/util/bitmap.h"
      71             : #include "lib/util/tevent_unix.h"
      72             : #include "libcli/security/sddl.h"
      73             : #include "passdb/machine_sid.h"
      74             : #include "lib/util/tevent_ntstatus.h"
      75             : #include "lib/util/string_wrappers.h"
      76             : #include "source3/lib/substitute.h"
      77             : 
      78             : static int vfs_full_audit_debug_level = DBGC_VFS;
      79             : 
      80             : struct vfs_full_audit_private_data {
      81             :         struct bitmap *success_ops;
      82             :         struct bitmap *failure_ops;
      83             :         int syslog_facility;
      84             :         int syslog_priority;
      85             :         bool log_secdesc;
      86             :         bool do_syslog;
      87             : };
      88             : 
      89             : #undef DBGC_CLASS
      90             : #define DBGC_CLASS vfs_full_audit_debug_level
      91             : 
      92             : typedef enum _vfs_op_type {
      93             :         SMB_VFS_OP_NOOP = -1,
      94             : 
      95             :         /* Disk operations */
      96             : 
      97             :         SMB_VFS_OP_CONNECT = 0,
      98             :         SMB_VFS_OP_DISCONNECT,
      99             :         SMB_VFS_OP_DISK_FREE,
     100             :         SMB_VFS_OP_GET_QUOTA,
     101             :         SMB_VFS_OP_SET_QUOTA,
     102             :         SMB_VFS_OP_GET_SHADOW_COPY_DATA,
     103             :         SMB_VFS_OP_STATVFS,
     104             :         SMB_VFS_OP_FS_CAPABILITIES,
     105             :         SMB_VFS_OP_GET_DFS_REFERRALS,
     106             :         SMB_VFS_OP_CREATE_DFS_PATHAT,
     107             :         SMB_VFS_OP_READ_DFS_PATHAT,
     108             : 
     109             :         /* Directory operations */
     110             : 
     111             :         SMB_VFS_OP_FDOPENDIR,
     112             :         SMB_VFS_OP_READDIR,
     113             :         SMB_VFS_OP_REWINDDIR,
     114             :         SMB_VFS_OP_MKDIRAT,
     115             :         SMB_VFS_OP_CLOSEDIR,
     116             : 
     117             :         /* File operations */
     118             : 
     119             :         SMB_VFS_OP_OPEN,
     120             :         SMB_VFS_OP_OPENAT,
     121             :         SMB_VFS_OP_CREATE_FILE,
     122             :         SMB_VFS_OP_CLOSE,
     123             :         SMB_VFS_OP_READ,
     124             :         SMB_VFS_OP_PREAD,
     125             :         SMB_VFS_OP_PREAD_SEND,
     126             :         SMB_VFS_OP_PREAD_RECV,
     127             :         SMB_VFS_OP_WRITE,
     128             :         SMB_VFS_OP_PWRITE,
     129             :         SMB_VFS_OP_PWRITE_SEND,
     130             :         SMB_VFS_OP_PWRITE_RECV,
     131             :         SMB_VFS_OP_LSEEK,
     132             :         SMB_VFS_OP_SENDFILE,
     133             :         SMB_VFS_OP_RECVFILE,
     134             :         SMB_VFS_OP_RENAMEAT,
     135             :         SMB_VFS_OP_FSYNC_SEND,
     136             :         SMB_VFS_OP_FSYNC_RECV,
     137             :         SMB_VFS_OP_STAT,
     138             :         SMB_VFS_OP_FSTAT,
     139             :         SMB_VFS_OP_LSTAT,
     140             :         SMB_VFS_OP_FSTATAT,
     141             :         SMB_VFS_OP_GET_ALLOC_SIZE,
     142             :         SMB_VFS_OP_UNLINKAT,
     143             :         SMB_VFS_OP_FCHMOD,
     144             :         SMB_VFS_OP_FCHOWN,
     145             :         SMB_VFS_OP_LCHOWN,
     146             :         SMB_VFS_OP_CHDIR,
     147             :         SMB_VFS_OP_GETWD,
     148             :         SMB_VFS_OP_NTIMES,
     149             :         SMB_VFS_OP_FNTIMES,
     150             :         SMB_VFS_OP_FTRUNCATE,
     151             :         SMB_VFS_OP_FALLOCATE,
     152             :         SMB_VFS_OP_LOCK,
     153             :         SMB_VFS_OP_FILESYSTEM_SHAREMODE,
     154             :         SMB_VFS_OP_FCNTL,
     155             :         SMB_VFS_OP_LINUX_SETLEASE,
     156             :         SMB_VFS_OP_GETLOCK,
     157             :         SMB_VFS_OP_SYMLINKAT,
     158             :         SMB_VFS_OP_READLINKAT,
     159             :         SMB_VFS_OP_LINKAT,
     160             :         SMB_VFS_OP_MKNODAT,
     161             :         SMB_VFS_OP_REALPATH,
     162             :         SMB_VFS_OP_FCHFLAGS,
     163             :         SMB_VFS_OP_FILE_ID_CREATE,
     164             :         SMB_VFS_OP_FS_FILE_ID,
     165             :         SMB_VFS_OP_FSTREAMINFO,
     166             :         SMB_VFS_OP_GET_REAL_FILENAME,
     167             :         SMB_VFS_OP_GET_REAL_FILENAME_AT,
     168             :         SMB_VFS_OP_CONNECTPATH,
     169             :         SMB_VFS_OP_BRL_LOCK_WINDOWS,
     170             :         SMB_VFS_OP_BRL_UNLOCK_WINDOWS,
     171             :         SMB_VFS_OP_STRICT_LOCK_CHECK,
     172             :         SMB_VFS_OP_TRANSLATE_NAME,
     173             :         SMB_VFS_OP_PARENT_PATHNAME,
     174             :         SMB_VFS_OP_FSCTL,
     175             :         SMB_VFS_OP_OFFLOAD_READ_SEND,
     176             :         SMB_VFS_OP_OFFLOAD_READ_RECV,
     177             :         SMB_VFS_OP_OFFLOAD_WRITE_SEND,
     178             :         SMB_VFS_OP_OFFLOAD_WRITE_RECV,
     179             :         SMB_VFS_OP_FGET_COMPRESSION,
     180             :         SMB_VFS_OP_SET_COMPRESSION,
     181             :         SMB_VFS_OP_SNAP_CHECK_PATH,
     182             :         SMB_VFS_OP_SNAP_CREATE,
     183             :         SMB_VFS_OP_SNAP_DELETE,
     184             : 
     185             :         /* DOS attribute operations. */
     186             :         SMB_VFS_OP_GET_DOS_ATTRIBUTES_SEND,
     187             :         SMB_VFS_OP_GET_DOS_ATTRIBUTES_RECV,
     188             :         SMB_VFS_OP_FGET_DOS_ATTRIBUTES,
     189             :         SMB_VFS_OP_FSET_DOS_ATTRIBUTES,
     190             : 
     191             :         /* NT ACL operations. */
     192             : 
     193             :         SMB_VFS_OP_FGET_NT_ACL,
     194             :         SMB_VFS_OP_FSET_NT_ACL,
     195             :         SMB_VFS_OP_AUDIT_FILE,
     196             : 
     197             :         /* POSIX ACL operations. */
     198             : 
     199             :         SMB_VFS_OP_SYS_ACL_GET_FD,
     200             :         SMB_VFS_OP_SYS_ACL_BLOB_GET_FD,
     201             :         SMB_VFS_OP_SYS_ACL_SET_FD,
     202             :         SMB_VFS_OP_SYS_ACL_DELETE_DEF_FD,
     203             : 
     204             :         /* EA operations. */
     205             :         SMB_VFS_OP_GETXATTRAT_SEND,
     206             :         SMB_VFS_OP_GETXATTRAT_RECV,
     207             :         SMB_VFS_OP_FGETXATTR,
     208             :         SMB_VFS_OP_FLISTXATTR,
     209             :         SMB_VFS_OP_REMOVEXATTR,
     210             :         SMB_VFS_OP_FREMOVEXATTR,
     211             :         SMB_VFS_OP_FSETXATTR,
     212             : 
     213             :         /* aio operations */
     214             :         SMB_VFS_OP_AIO_FORCE,
     215             : 
     216             :         /* offline operations */
     217             :         SMB_VFS_OP_IS_OFFLINE,
     218             :         SMB_VFS_OP_SET_OFFLINE,
     219             : 
     220             :         /* Durable handle operations. */
     221             :         SMB_VFS_OP_DURABLE_COOKIE,
     222             :         SMB_VFS_OP_DURABLE_DISCONNECT,
     223             :         SMB_VFS_OP_DURABLE_RECONNECT,
     224             : 
     225             :         SMB_VFS_OP_FREADDIR_ATTR,
     226             : 
     227             :         /* This should always be last enum value */
     228             : 
     229             :         SMB_VFS_OP_LAST
     230             : } vfs_op_type;
     231             : 
     232             : /* The following array *must* be in the same order as defined in vfs_op_type */
     233             : 
     234             : static struct {
     235             :         vfs_op_type type;
     236             :         const char *name;
     237             : } vfs_op_names[] = {
     238             :         { SMB_VFS_OP_CONNECT,   "connect" },
     239             :         { SMB_VFS_OP_DISCONNECT,        "disconnect" },
     240             :         { SMB_VFS_OP_DISK_FREE, "disk_free" },
     241             :         { SMB_VFS_OP_GET_QUOTA, "get_quota" },
     242             :         { SMB_VFS_OP_SET_QUOTA, "set_quota" },
     243             :         { SMB_VFS_OP_GET_SHADOW_COPY_DATA,      "get_shadow_copy_data" },
     244             :         { SMB_VFS_OP_STATVFS,   "statvfs" },
     245             :         { SMB_VFS_OP_FS_CAPABILITIES,   "fs_capabilities" },
     246             :         { SMB_VFS_OP_GET_DFS_REFERRALS, "get_dfs_referrals" },
     247             :         { SMB_VFS_OP_CREATE_DFS_PATHAT, "create_dfs_pathat" },
     248             :         { SMB_VFS_OP_READ_DFS_PATHAT,   "read_dfs_pathat" },
     249             :         { SMB_VFS_OP_FDOPENDIR, "fdopendir" },
     250             :         { SMB_VFS_OP_READDIR,   "readdir" },
     251             :         { SMB_VFS_OP_REWINDDIR, "rewinddir" },
     252             :         { SMB_VFS_OP_MKDIRAT,   "mkdirat" },
     253             :         { SMB_VFS_OP_CLOSEDIR,  "closedir" },
     254             :         { SMB_VFS_OP_OPEN,      "open" },
     255             :         { SMB_VFS_OP_OPENAT,    "openat" },
     256             :         { SMB_VFS_OP_CREATE_FILE, "create_file" },
     257             :         { SMB_VFS_OP_CLOSE,     "close" },
     258             :         { SMB_VFS_OP_READ,      "read" },
     259             :         { SMB_VFS_OP_PREAD,     "pread" },
     260             :         { SMB_VFS_OP_PREAD_SEND,        "pread_send" },
     261             :         { SMB_VFS_OP_PREAD_RECV,        "pread_recv" },
     262             :         { SMB_VFS_OP_WRITE,     "write" },
     263             :         { SMB_VFS_OP_PWRITE,    "pwrite" },
     264             :         { SMB_VFS_OP_PWRITE_SEND,       "pwrite_send" },
     265             :         { SMB_VFS_OP_PWRITE_RECV,       "pwrite_recv" },
     266             :         { SMB_VFS_OP_LSEEK,     "lseek" },
     267             :         { SMB_VFS_OP_SENDFILE,  "sendfile" },
     268             :         { SMB_VFS_OP_RECVFILE,  "recvfile" },
     269             :         { SMB_VFS_OP_RENAMEAT,  "renameat" },
     270             :         { SMB_VFS_OP_FSYNC_SEND,        "fsync_send" },
     271             :         { SMB_VFS_OP_FSYNC_RECV,        "fsync_recv" },
     272             :         { SMB_VFS_OP_STAT,      "stat" },
     273             :         { SMB_VFS_OP_FSTAT,     "fstat" },
     274             :         { SMB_VFS_OP_LSTAT,     "lstat" },
     275             :         { SMB_VFS_OP_FSTATAT,   "fstatat" },
     276             :         { SMB_VFS_OP_GET_ALLOC_SIZE,    "get_alloc_size" },
     277             :         { SMB_VFS_OP_UNLINKAT,  "unlinkat" },
     278             :         { SMB_VFS_OP_FCHMOD,    "fchmod" },
     279             :         { SMB_VFS_OP_FCHOWN,    "fchown" },
     280             :         { SMB_VFS_OP_LCHOWN,    "lchown" },
     281             :         { SMB_VFS_OP_CHDIR,     "chdir" },
     282             :         { SMB_VFS_OP_GETWD,     "getwd" },
     283             :         { SMB_VFS_OP_NTIMES,    "ntimes" },
     284             :         { SMB_VFS_OP_FNTIMES,   "fntimes" },
     285             :         { SMB_VFS_OP_FTRUNCATE, "ftruncate" },
     286             :         { SMB_VFS_OP_FALLOCATE,"fallocate" },
     287             :         { SMB_VFS_OP_LOCK,      "lock" },
     288             :         { SMB_VFS_OP_FILESYSTEM_SHAREMODE,      "filesystem_sharemode" },
     289             :         { SMB_VFS_OP_FCNTL,     "fcntl" },
     290             :         { SMB_VFS_OP_LINUX_SETLEASE, "linux_setlease" },
     291             :         { SMB_VFS_OP_GETLOCK,   "getlock" },
     292             :         { SMB_VFS_OP_SYMLINKAT, "symlinkat" },
     293             :         { SMB_VFS_OP_READLINKAT,"readlinkat" },
     294             :         { SMB_VFS_OP_LINKAT,    "linkat" },
     295             :         { SMB_VFS_OP_MKNODAT,   "mknodat" },
     296             :         { SMB_VFS_OP_REALPATH,  "realpath" },
     297             :         { SMB_VFS_OP_FCHFLAGS,  "fchflags" },
     298             :         { SMB_VFS_OP_FILE_ID_CREATE,    "file_id_create" },
     299             :         { SMB_VFS_OP_FS_FILE_ID,        "fs_file_id" },
     300             :         { SMB_VFS_OP_FSTREAMINFO,       "fstreaminfo" },
     301             :         { SMB_VFS_OP_GET_REAL_FILENAME, "get_real_filename" },
     302             :         { SMB_VFS_OP_GET_REAL_FILENAME_AT, "get_real_filename_at" },
     303             :         { SMB_VFS_OP_CONNECTPATH,       "connectpath" },
     304             :         { SMB_VFS_OP_BRL_LOCK_WINDOWS,  "brl_lock_windows" },
     305             :         { SMB_VFS_OP_BRL_UNLOCK_WINDOWS, "brl_unlock_windows" },
     306             :         { SMB_VFS_OP_STRICT_LOCK_CHECK, "strict_lock_check" },
     307             :         { SMB_VFS_OP_TRANSLATE_NAME,    "translate_name" },
     308             :         { SMB_VFS_OP_PARENT_PATHNAME,   "parent_pathname" },
     309             :         { SMB_VFS_OP_FSCTL,             "fsctl" },
     310             :         { SMB_VFS_OP_OFFLOAD_READ_SEND, "offload_read_send" },
     311             :         { SMB_VFS_OP_OFFLOAD_READ_RECV, "offload_read_recv" },
     312             :         { SMB_VFS_OP_OFFLOAD_WRITE_SEND,        "offload_write_send" },
     313             :         { SMB_VFS_OP_OFFLOAD_WRITE_RECV,        "offload_write_recv" },
     314             :         { SMB_VFS_OP_FGET_COMPRESSION,  "fget_compression" },
     315             :         { SMB_VFS_OP_SET_COMPRESSION,   "set_compression" },
     316             :         { SMB_VFS_OP_SNAP_CHECK_PATH, "snap_check_path" },
     317             :         { SMB_VFS_OP_SNAP_CREATE, "snap_create" },
     318             :         { SMB_VFS_OP_SNAP_DELETE, "snap_delete" },
     319             :         { SMB_VFS_OP_GET_DOS_ATTRIBUTES_SEND, "get_dos_attributes_send" },
     320             :         { SMB_VFS_OP_GET_DOS_ATTRIBUTES_RECV, "get_dos_attributes_recv" },
     321             :         { SMB_VFS_OP_FGET_DOS_ATTRIBUTES, "fget_dos_attributes" },
     322             :         { SMB_VFS_OP_FSET_DOS_ATTRIBUTES, "fset_dos_attributes" },
     323             :         { SMB_VFS_OP_FGET_NT_ACL,       "fget_nt_acl" },
     324             :         { SMB_VFS_OP_FSET_NT_ACL,       "fset_nt_acl" },
     325             :         { SMB_VFS_OP_AUDIT_FILE,        "audit_file" },
     326             :         { SMB_VFS_OP_SYS_ACL_GET_FD,    "sys_acl_get_fd" },
     327             :         { SMB_VFS_OP_SYS_ACL_BLOB_GET_FD,       "sys_acl_blob_get_fd" },
     328             :         { SMB_VFS_OP_SYS_ACL_SET_FD,    "sys_acl_set_fd" },
     329             :         { SMB_VFS_OP_SYS_ACL_DELETE_DEF_FD,     "sys_acl_delete_def_fd" },
     330             :         { SMB_VFS_OP_GETXATTRAT_SEND, "getxattrat_send" },
     331             :         { SMB_VFS_OP_GETXATTRAT_RECV, "getxattrat_recv" },
     332             :         { SMB_VFS_OP_FGETXATTR, "fgetxattr" },
     333             :         { SMB_VFS_OP_FLISTXATTR,        "flistxattr" },
     334             :         { SMB_VFS_OP_REMOVEXATTR,       "removexattr" },
     335             :         { SMB_VFS_OP_FREMOVEXATTR,      "fremovexattr" },
     336             :         { SMB_VFS_OP_FSETXATTR, "fsetxattr" },
     337             :         { SMB_VFS_OP_AIO_FORCE, "aio_force" },
     338             :         { SMB_VFS_OP_IS_OFFLINE, "is_offline" },
     339             :         { SMB_VFS_OP_SET_OFFLINE, "set_offline" },
     340             :         { SMB_VFS_OP_DURABLE_COOKIE, "durable_cookie" },
     341             :         { SMB_VFS_OP_DURABLE_DISCONNECT, "durable_disconnect" },
     342             :         { SMB_VFS_OP_DURABLE_RECONNECT, "durable_reconnect" },
     343             :         { SMB_VFS_OP_FREADDIR_ATTR,      "freaddir_attr" },
     344             :         { SMB_VFS_OP_LAST, NULL }
     345             : };
     346             : 
     347       40061 : static int audit_syslog_facility(vfs_handle_struct *handle)
     348             : {
     349           0 :         static const struct enum_list enum_log_facilities[] = {
     350             : #ifdef LOG_AUTH
     351             :                 { LOG_AUTH,             "AUTH" },
     352             : #endif
     353             : #ifdef LOG_AUTHPRIV
     354             :                 { LOG_AUTHPRIV,         "AUTHPRIV" },
     355             : #endif
     356             : #ifdef LOG_AUDIT
     357             :                 { LOG_AUDIT,            "AUDIT" },
     358             : #endif
     359             : #ifdef LOG_CONSOLE
     360             :                 { LOG_CONSOLE,          "CONSOLE" },
     361             : #endif
     362             : #ifdef LOG_CRON
     363             :                 { LOG_CRON,             "CRON" },
     364             : #endif
     365             : #ifdef LOG_DAEMON
     366             :                 { LOG_DAEMON,           "DAEMON" },
     367             : #endif
     368             : #ifdef LOG_FTP
     369             :                 { LOG_FTP,              "FTP" },
     370             : #endif
     371             : #ifdef LOG_INSTALL
     372             :                 { LOG_INSTALL,          "INSTALL" },
     373             : #endif
     374             : #ifdef LOG_KERN
     375             :                 { LOG_KERN,             "KERN" },
     376             : #endif
     377             : #ifdef LOG_LAUNCHD
     378             :                 { LOG_LAUNCHD,          "LAUNCHD" },
     379             : #endif
     380             : #ifdef LOG_LFMT
     381             :                 { LOG_LFMT,             "LFMT" },
     382             : #endif
     383             : #ifdef LOG_LPR
     384             :                 { LOG_LPR,              "LPR" },
     385             : #endif
     386             : #ifdef LOG_MAIL
     387             :                 { LOG_MAIL,             "MAIL" },
     388             : #endif
     389             : #ifdef LOG_MEGASAFE
     390             :                 { LOG_MEGASAFE,         "MEGASAFE" },
     391             : #endif
     392             : #ifdef LOG_NETINFO
     393             :                 { LOG_NETINFO,          "NETINFO" },
     394             : #endif
     395             : #ifdef LOG_NEWS
     396             :                 { LOG_NEWS,             "NEWS" },
     397             : #endif
     398             : #ifdef LOG_NFACILITIES
     399             :                 { LOG_NFACILITIES,      "NFACILITIES" },
     400             : #endif
     401             : #ifdef LOG_NTP
     402             :                 { LOG_NTP,              "NTP" },
     403             : #endif
     404             : #ifdef LOG_RAS
     405             :                 { LOG_RAS,              "RAS" },
     406             : #endif
     407             : #ifdef LOG_REMOTEAUTH
     408             :                 { LOG_REMOTEAUTH,       "REMOTEAUTH" },
     409             : #endif
     410             : #ifdef LOG_SECURITY
     411             :                 { LOG_SECURITY,         "SECURITY" },
     412             : #endif
     413             : #ifdef LOG_SYSLOG
     414             :                 { LOG_SYSLOG,           "SYSLOG" },
     415             : #endif
     416             : #ifdef LOG_USER
     417             :                 { LOG_USER,             "USER" },
     418             : #endif
     419             : #ifdef LOG_UUCP
     420             :                 { LOG_UUCP,             "UUCP" },
     421             : #endif
     422             :                 { LOG_LOCAL0,           "LOCAL0" },
     423             :                 { LOG_LOCAL1,           "LOCAL1" },
     424             :                 { LOG_LOCAL2,           "LOCAL2" },
     425             :                 { LOG_LOCAL3,           "LOCAL3" },
     426             :                 { LOG_LOCAL4,           "LOCAL4" },
     427             :                 { LOG_LOCAL5,           "LOCAL5" },
     428             :                 { LOG_LOCAL6,           "LOCAL6" },
     429             :                 { LOG_LOCAL7,           "LOCAL7" },
     430             :                 { -1,                   NULL }
     431             :         };
     432             : 
     433           0 :         int facility;
     434             : 
     435       40061 :         facility = lp_parm_enum(SNUM(handle->conn), "full_audit", "facility", enum_log_facilities, LOG_USER);
     436             : 
     437       40061 :         return facility;
     438             : }
     439             : 
     440       40061 : static int audit_syslog_priority(vfs_handle_struct *handle)
     441             : {
     442           0 :         static const struct enum_list enum_log_priorities[] = {
     443             :                 { LOG_EMERG, "EMERG" },
     444             :                 { LOG_ALERT, "ALERT" },
     445             :                 { LOG_CRIT, "CRIT" },
     446             :                 { LOG_ERR, "ERR" },
     447             :                 { LOG_WARNING, "WARNING" },
     448             :                 { LOG_NOTICE, "NOTICE" },
     449             :                 { LOG_INFO, "INFO" },
     450             :                 { LOG_DEBUG, "DEBUG" },
     451             :                 { -1, NULL }
     452             :         };
     453             : 
     454           0 :         int priority;
     455             : 
     456       40061 :         priority = lp_parm_enum(SNUM(handle->conn), "full_audit", "priority",
     457             :                                 enum_log_priorities, LOG_NOTICE);
     458       40061 :         if (priority == -1) {
     459           0 :                 priority = LOG_WARNING;
     460             :         }
     461             : 
     462       40061 :         return priority;
     463             : }
     464             : 
     465           0 : static char *audit_prefix(TALLOC_CTX *ctx, connection_struct *conn)
     466             : {
     467           0 :         const struct loadparm_substitution *lp_sub =
     468           0 :                 loadparm_s3_global_substitution();
     469           0 :         char *prefix = NULL;
     470           0 :         char *result;
     471             : 
     472           0 :         prefix = talloc_strdup(ctx,
     473           0 :                         lp_parm_const_string(SNUM(conn), "full_audit",
     474             :                                              "prefix", "%u|%I"));
     475           0 :         if (!prefix) {
     476           0 :                 return NULL;
     477             :         }
     478           0 :         result = talloc_sub_full(ctx,
     479           0 :                         lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),
     480           0 :                         conn->session_info->unix_info->unix_name,
     481           0 :                         conn->connectpath,
     482           0 :                         conn->session_info->unix_token->gid,
     483           0 :                         conn->session_info->unix_info->sanitized_username,
     484           0 :                         conn->session_info->info->domain_name,
     485             :                         prefix);
     486           0 :         TALLOC_FREE(prefix);
     487           0 :         return result;
     488             : }
     489             : 
     490   133008445 : static bool log_success(struct vfs_full_audit_private_data *pd, vfs_op_type op)
     491             : {
     492   133008445 :         if (pd->success_ops == NULL) {
     493           0 :                 return True;
     494             :         }
     495             : 
     496   133008445 :         return bitmap_query(pd->success_ops, op);
     497             : }
     498             : 
     499    81659784 : static bool log_failure(struct vfs_full_audit_private_data *pd, vfs_op_type op)
     500             : {
     501    81659784 :         if (pd->failure_ops == NULL)
     502           0 :                 return True;
     503             : 
     504    81659784 :         return bitmap_query(pd->failure_ops, op);
     505             : }
     506             : 
     507       80114 : static struct bitmap *init_bitmap(TALLOC_CTX *mem_ctx, const char **ops)
     508             : {
     509           0 :         struct bitmap *bm;
     510             : 
     511       80114 :         if (ops == NULL) {
     512           0 :                 DBG_ERR("init_bitmap, ops list is empty (logic error)\n");
     513           0 :                 return NULL;
     514             :         }
     515             : 
     516       80114 :         bm = bitmap_talloc(mem_ctx, SMB_VFS_OP_LAST);
     517       80114 :         if (bm == NULL) {
     518           0 :                 DBG_ERR("Could not alloc bitmap\n");
     519           0 :                 return NULL;
     520             :         }
     521             : 
     522       80114 :         for (; *ops != NULL; ops += 1) {
     523           0 :                 int i;
     524       80114 :                 bool neg = false;
     525           0 :                 const char *op;
     526             : 
     527       80114 :                 if (strequal(*ops, "all")) {
     528           0 :                         for (i=0; i<SMB_VFS_OP_LAST; i++) {
     529           0 :                                 bitmap_set(bm, i);
     530             :                         }
     531           0 :                         continue;
     532             :                 }
     533             : 
     534       80114 :                 if (strequal(*ops, "none")) {
     535       80098 :                         break;
     536             :                 }
     537             : 
     538          16 :                 op = ops[0];
     539          16 :                 if (op[0] == '!') {
     540           0 :                         neg = true;
     541           0 :                         op += 1;
     542             :                 }
     543             : 
     544        1712 :                 for (i=0; i<SMB_VFS_OP_LAST; i++) {
     545        1696 :                         if ((vfs_op_names[i].name == NULL)
     546        1696 :                          || (vfs_op_names[i].type != i)) {
     547           0 :                                 smb_panic("vfs_full_audit.c: name table not "
     548             :                                           "in sync with vfs_op_type enums\n");
     549             :                         }
     550        1696 :                         if (strequal(op, vfs_op_names[i].name)) {
     551           0 :                                 if (neg) {
     552           0 :                                         bitmap_clear(bm, i);
     553             :                                 } else {
     554           0 :                                         bitmap_set(bm, i);
     555             :                                 }
     556           0 :                                 break;
     557             :                         }
     558             :                 }
     559          16 :                 if (i == SMB_VFS_OP_LAST) {
     560          16 :                         DBG_ERR("Could not find opname %s\n", *ops);
     561          16 :                         TALLOC_FREE(bm);
     562          16 :                         return NULL;
     563             :                 }
     564             :         }
     565       80098 :         return bm;
     566             : }
     567             : 
     568           0 : static const char *audit_opname(vfs_op_type op)
     569             : {
     570           0 :         if (op >= SMB_VFS_OP_LAST)
     571           0 :                 return "INVALID VFS OP";
     572           0 :         return vfs_op_names[op].name;
     573             : }
     574             : 
     575             : static TALLOC_CTX *tmp_do_log_ctx;
     576             : /*
     577             :  * Get us a temporary talloc context usable just for DEBUG arguments
     578             :  */
     579    99582964 : static TALLOC_CTX *do_log_ctx(void)
     580             : {
     581    99582964 :         if (tmp_do_log_ctx == NULL) {
     582    35774146 :                 tmp_do_log_ctx = talloc_named_const(NULL, 0, "do_log_ctx");
     583             :         }
     584    99582964 :         return tmp_do_log_ctx;
     585             : }
     586             : 
     587             : static void do_log(vfs_op_type op, bool success, vfs_handle_struct *handle,
     588             :                    const char *format, ...) PRINTF_ATTRIBUTE(4, 5);
     589             : 
     590   214668229 : static void do_log(vfs_op_type op, bool success, vfs_handle_struct *handle,
     591             :                    const char *format, ...)
     592             : {
     593           0 :         struct vfs_full_audit_private_data *pd;
     594           0 :         fstring err_msg;
     595   214668229 :         char *audit_pre = NULL;
     596           0 :         va_list ap;
     597   214668229 :         char *op_msg = NULL;
     598             : 
     599   214668229 :         SMB_VFS_HANDLE_GET_DATA(handle, pd,
     600             :                                 struct vfs_full_audit_private_data,
     601           0 :                                 return;);
     602             : 
     603   214668229 :         if (success && (!log_success(pd, op)))
     604   133008445 :                 goto out;
     605             : 
     606    81659784 :         if (!success && (!log_failure(pd, op)))
     607    81659784 :                 goto out;
     608             : 
     609           0 :         if (success)
     610           0 :                 fstrcpy(err_msg, "ok");
     611             :         else
     612           0 :                 fstr_sprintf(err_msg, "fail (%s)", strerror(errno));
     613             : 
     614           0 :         va_start(ap, format);
     615           0 :         op_msg = talloc_vasprintf(talloc_tos(), format, ap);
     616           0 :         va_end(ap);
     617             : 
     618           0 :         if (!op_msg) {
     619           0 :                 goto out;
     620             :         }
     621             : 
     622           0 :         audit_pre = audit_prefix(talloc_tos(), handle->conn);
     623             : 
     624           0 :         if (pd->do_syslog) {
     625           0 :                 int priority;
     626             : 
     627             :                 /*
     628             :                  * Specify the facility to interoperate with other syslog
     629             :                  * callers (smbd for example).
     630             :                  */
     631           0 :                 priority = pd->syslog_priority | pd->syslog_facility;
     632             : 
     633           0 :                 syslog(priority, "%s|%s|%s|%s\n",
     634             :                        audit_pre ? audit_pre : "",
     635             :                        audit_opname(op), err_msg, op_msg);
     636             :         } else {
     637           0 :                 DEBUG(1, ("%s|%s|%s|%s\n",
     638             :                           audit_pre ? audit_pre : "",
     639             :                           audit_opname(op), err_msg, op_msg));
     640             :         }
     641   214668229 :  out:
     642   214668229 :         TALLOC_FREE(audit_pre);
     643   214668229 :         TALLOC_FREE(op_msg);
     644   214668229 :         TALLOC_FREE(tmp_do_log_ctx);
     645             : }
     646             : 
     647             : /**
     648             :  * Return a string using the do_log_ctx()
     649             :  */
     650    35811450 : static const char *smb_fname_str_do_log(struct connection_struct *conn,
     651             :                                 const struct smb_filename *smb_fname)
     652             : {
     653    35811450 :         char *fname = NULL;
     654           0 :         NTSTATUS status;
     655             : 
     656    35811450 :         if (smb_fname == NULL) {
     657           0 :                 return "";
     658             :         }
     659             : 
     660    35811450 :         if (smb_fname->base_name[0] != '/') {
     661    31885757 :                 char *abs_name = NULL;
     662    31885757 :                 struct smb_filename *fname_copy = cp_smb_filename(
     663             :                                                         do_log_ctx(),
     664             :                                                         smb_fname);
     665    31885757 :                 if (fname_copy == NULL) {
     666           0 :                         return "";
     667             :                 }
     668             : 
     669    31885757 :                 if (!ISDOT(smb_fname->base_name)) {
     670    19900699 :                         abs_name = talloc_asprintf(do_log_ctx(),
     671             :                                         "%s/%s",
     672    19900699 :                                         conn->cwd_fsp->fsp_name->base_name,
     673    19900699 :                                         smb_fname->base_name);
     674             :                 } else {
     675    11985058 :                         abs_name = talloc_strdup(do_log_ctx(),
     676    11985058 :                                         conn->cwd_fsp->fsp_name->base_name);
     677             :                 }
     678    31885757 :                 if (abs_name == NULL) {
     679           0 :                         return "";
     680             :                 }
     681    31885757 :                 fname_copy->base_name = abs_name;
     682    31885757 :                 smb_fname = fname_copy;
     683             :         }
     684             : 
     685    35811450 :         status = get_full_smb_filename(do_log_ctx(), smb_fname, &fname);
     686    35811450 :         if (!NT_STATUS_IS_OK(status)) {
     687           0 :                 return "";
     688             :         }
     689    35811450 :         return fname;
     690             : }
     691             : 
     692             : /**
     693             :  * Return an fsp debug string using the do_log_ctx()
     694             :  */
     695    24305061 : static const char *fsp_str_do_log(const struct files_struct *fsp)
     696             : {
     697    24305061 :         return smb_fname_str_do_log(fsp->conn, fsp->fsp_name);
     698             : }
     699             : 
     700             : /* Implementation of vfs_ops.  Pass everything on to the default
     701             :    operation but log event first. */
     702             : 
     703       40061 : static int smb_full_audit_connect(vfs_handle_struct *handle,
     704             :                          const char *svc, const char *user)
     705             : {
     706           0 :         int result;
     707       40061 :         const char *none[] = { "none" };
     708       40061 :         struct vfs_full_audit_private_data *pd = NULL;
     709             : 
     710       40061 :         result = SMB_VFS_NEXT_CONNECT(handle, svc, user);
     711       40061 :         if (result < 0) {
     712           0 :                 return result;
     713             :         }
     714             : 
     715       40061 :         pd = talloc_zero(handle, struct vfs_full_audit_private_data);
     716       40061 :         if (!pd) {
     717           0 :                 SMB_VFS_NEXT_DISCONNECT(handle);
     718           0 :                 return -1;
     719             :         }
     720             : 
     721       40061 :         pd->syslog_facility = audit_syslog_facility(handle);
     722       40061 :         if (pd->syslog_facility == -1) {
     723           0 :                 DEBUG(1, ("%s: Unknown facility %s\n", __func__,
     724             :                           lp_parm_const_string(SNUM(handle->conn),
     725             :                                                "full_audit", "facility",
     726             :                                                "USER")));
     727           0 :                 SMB_VFS_NEXT_DISCONNECT(handle);
     728           0 :                 return -1;
     729             :         }
     730             : 
     731       40061 :         pd->syslog_priority = audit_syslog_priority(handle);
     732             : 
     733       40061 :         pd->log_secdesc = lp_parm_bool(SNUM(handle->conn),
     734             :                                        "full_audit", "log_secdesc", false);
     735             : 
     736       40061 :         pd->do_syslog = lp_parm_bool(SNUM(handle->conn),
     737             :                                      "full_audit", "syslog", true);
     738             : 
     739             : #ifdef WITH_SYSLOG
     740       40061 :         if (pd->do_syslog) {
     741           0 :                 openlog("smbd_audit", 0, pd->syslog_facility);
     742             :         }
     743             : #endif
     744             : 
     745       40061 :         pd->success_ops = init_bitmap(
     746       40061 :                 pd, lp_parm_string_list(SNUM(handle->conn), "full_audit",
     747             :                                         "success", none));
     748       40061 :         if (pd->success_ops == NULL) {
     749           8 :                 DBG_ERR("Invalid success operations list. Failing connect\n");
     750           8 :                 SMB_VFS_NEXT_DISCONNECT(handle);
     751           8 :                 return -1;
     752             :         }
     753       40053 :         pd->failure_ops = init_bitmap(
     754       40053 :                 pd, lp_parm_string_list(SNUM(handle->conn), "full_audit",
     755             :                                         "failure", none));
     756       40053 :         if (pd->failure_ops == NULL) {
     757           8 :                 DBG_ERR("Invalid failure operations list. Failing connect\n");
     758           8 :                 SMB_VFS_NEXT_DISCONNECT(handle);
     759           8 :                 return -1;
     760             :         }
     761             : 
     762             :         /* Store the private data. */
     763       40045 :         SMB_VFS_HANDLE_SET_DATA(handle, pd, NULL,
     764           0 :                                 struct vfs_full_audit_private_data, return -1);
     765             : 
     766       40045 :         do_log(SMB_VFS_OP_CONNECT, True, handle,
     767             :                "%s", svc);
     768             : 
     769       40045 :         return 0;
     770             : }
     771             : 
     772       40013 : static void smb_full_audit_disconnect(vfs_handle_struct *handle)
     773             : {
     774           0 :         const struct loadparm_substitution *lp_sub =
     775       40013 :                 loadparm_s3_global_substitution();
     776             : 
     777       40013 :         SMB_VFS_NEXT_DISCONNECT(handle);
     778             : 
     779       40013 :         do_log(SMB_VFS_OP_DISCONNECT, True, handle,
     780       40013 :                "%s", lp_servicename(talloc_tos(), lp_sub, SNUM(handle->conn)));
     781             : 
     782             :         /* The bitmaps will be disconnected when the private
     783             :            data is deleted. */
     784       40013 : }
     785             : 
     786         967 : static uint64_t smb_full_audit_disk_free(vfs_handle_struct *handle,
     787             :                                 const struct smb_filename *smb_fname,
     788             :                                 uint64_t *bsize,
     789             :                                 uint64_t *dfree,
     790             :                                 uint64_t *dsize)
     791             : {
     792           0 :         uint64_t result;
     793             : 
     794         967 :         result = SMB_VFS_NEXT_DISK_FREE(handle, smb_fname, bsize, dfree, dsize);
     795             : 
     796             :         /* Don't have a reasonable notion of failure here */
     797             : 
     798         967 :         do_log(SMB_VFS_OP_DISK_FREE,
     799             :                True,
     800             :                handle,
     801             :                "%s",
     802             :                smb_fname_str_do_log(handle->conn, smb_fname));
     803             : 
     804         967 :         return result;
     805             : }
     806             : 
     807        2014 : static int smb_full_audit_get_quota(struct vfs_handle_struct *handle,
     808             :                                 const struct smb_filename *smb_fname,
     809             :                                 enum SMB_QUOTA_TYPE qtype,
     810             :                                 unid_t id,
     811             :                                 SMB_DISK_QUOTA *qt)
     812             : {
     813           0 :         int result;
     814             : 
     815        2014 :         result = SMB_VFS_NEXT_GET_QUOTA(handle, smb_fname, qtype, id, qt);
     816             : 
     817        2014 :         do_log(SMB_VFS_OP_GET_QUOTA,
     818             :                (result >= 0),
     819             :                handle,
     820             :                "%s",
     821             :                smb_fname_str_do_log(handle->conn, smb_fname));
     822             : 
     823        2014 :         return result;
     824             : }
     825             : 
     826           4 : static int smb_full_audit_set_quota(struct vfs_handle_struct *handle,
     827             :                            enum SMB_QUOTA_TYPE qtype, unid_t id,
     828             :                            SMB_DISK_QUOTA *qt)
     829             : {
     830           0 :         int result;
     831             : 
     832           4 :         result = SMB_VFS_NEXT_SET_QUOTA(handle, qtype, id, qt);
     833             : 
     834           4 :         do_log(SMB_VFS_OP_SET_QUOTA, (result >= 0), handle, "");
     835             : 
     836           4 :         return result;
     837             : }
     838             : 
     839         252 : static int smb_full_audit_get_shadow_copy_data(struct vfs_handle_struct *handle,
     840             :                                 struct files_struct *fsp,
     841             :                                 struct shadow_copy_data *shadow_copy_data,
     842             :                                 bool labels)
     843             : {
     844           0 :         int result;
     845             : 
     846         252 :         result = SMB_VFS_NEXT_GET_SHADOW_COPY_DATA(handle, fsp, shadow_copy_data, labels);
     847             : 
     848         252 :         do_log(SMB_VFS_OP_GET_SHADOW_COPY_DATA, (result >= 0), handle, "");
     849             : 
     850         252 :         return result;
     851             : }
     852             : 
     853       19068 : static int smb_full_audit_statvfs(struct vfs_handle_struct *handle,
     854             :                                 const struct smb_filename *smb_fname,
     855             :                                 struct vfs_statvfs_struct *statbuf)
     856             : {
     857           0 :         int result;
     858             : 
     859       19068 :         result = SMB_VFS_NEXT_STATVFS(handle, smb_fname, statbuf);
     860             : 
     861       19068 :         do_log(SMB_VFS_OP_STATVFS, (result >= 0), handle, "");
     862             : 
     863       19068 :         return result;
     864             : }
     865             : 
     866       19068 : static uint32_t smb_full_audit_fs_capabilities(struct vfs_handle_struct *handle, enum timestamp_set_resolution *p_ts_res)
     867             : {
     868           0 :         int result;
     869             : 
     870       19068 :         result = SMB_VFS_NEXT_FS_CAPABILITIES(handle, p_ts_res);
     871             : 
     872       19068 :         do_log(SMB_VFS_OP_FS_CAPABILITIES, true, handle, "");
     873             : 
     874       19068 :         return result;
     875             : }
     876             : 
     877       14938 : static NTSTATUS smb_full_audit_get_dfs_referrals(
     878             :                                 struct vfs_handle_struct *handle,
     879             :                                 struct dfs_GetDFSReferral *r)
     880             : {
     881           0 :         NTSTATUS status;
     882             : 
     883       14938 :         status = SMB_VFS_NEXT_GET_DFS_REFERRALS(handle, r);
     884             : 
     885       14938 :         do_log(SMB_VFS_OP_GET_DFS_REFERRALS, NT_STATUS_IS_OK(status),
     886             :                handle, "");
     887             : 
     888       14938 :         return status;
     889             : }
     890             : 
     891           0 : static NTSTATUS smb_full_audit_create_dfs_pathat(struct vfs_handle_struct *handle,
     892             :                                 struct files_struct *dirfsp,
     893             :                                 const struct smb_filename *smb_fname,
     894             :                                 const struct referral *reflist,
     895             :                                 size_t referral_count)
     896             : {
     897           0 :         NTSTATUS status;
     898           0 :         struct smb_filename *full_fname = NULL;
     899             : 
     900           0 :         full_fname = full_path_from_dirfsp_atname(talloc_tos(),
     901             :                                                   dirfsp,
     902             :                                                   smb_fname);
     903           0 :         if (full_fname == NULL) {
     904           0 :                 return NT_STATUS_NO_MEMORY;
     905             :         }
     906             : 
     907           0 :         status = SMB_VFS_NEXT_CREATE_DFS_PATHAT(handle,
     908             :                         dirfsp,
     909             :                         smb_fname,
     910             :                         reflist,
     911             :                         referral_count);
     912             : 
     913           0 :         do_log(SMB_VFS_OP_CREATE_DFS_PATHAT,
     914           0 :                 NT_STATUS_IS_OK(status),
     915             :                 handle,
     916             :                 "%s",
     917             :                 smb_fname_str_do_log(handle->conn, full_fname));
     918             : 
     919           0 :         TALLOC_FREE(full_fname);
     920           0 :         return status;
     921             : }
     922             : 
     923        4942 : static NTSTATUS smb_full_audit_read_dfs_pathat(struct vfs_handle_struct *handle,
     924             :                         TALLOC_CTX *mem_ctx,
     925             :                         struct files_struct *dirfsp,
     926             :                         struct smb_filename *smb_fname,
     927             :                         struct referral **ppreflist,
     928             :                         size_t *preferral_count)
     929             : {
     930        4942 :         struct smb_filename *full_fname = NULL;
     931           0 :         NTSTATUS status;
     932             : 
     933        4942 :         full_fname = full_path_from_dirfsp_atname(talloc_tos(),
     934             :                                                   dirfsp,
     935             :                                                   smb_fname);
     936        4942 :         if (full_fname == NULL) {
     937           0 :                 return NT_STATUS_NO_MEMORY;
     938             :         }
     939             : 
     940        4942 :         status = SMB_VFS_NEXT_READ_DFS_PATHAT(handle,
     941             :                         mem_ctx,
     942             :                         dirfsp,
     943             :                         smb_fname,
     944             :                         ppreflist,
     945             :                         preferral_count);
     946             : 
     947        4942 :         do_log(SMB_VFS_OP_READ_DFS_PATHAT,
     948        4942 :                 NT_STATUS_IS_OK(status),
     949             :                 handle,
     950             :                 "%s",
     951             :                 smb_fname_str_do_log(handle->conn, full_fname));
     952             : 
     953        4942 :         TALLOC_FREE(full_fname);
     954        4942 :         return status;
     955             : }
     956             : 
     957           0 : static NTSTATUS smb_full_audit_snap_check_path(struct vfs_handle_struct *handle,
     958             :                                                TALLOC_CTX *mem_ctx,
     959             :                                                const char *service_path,
     960             :                                                char **base_volume)
     961             : {
     962           0 :         NTSTATUS status;
     963             : 
     964           0 :         status = SMB_VFS_NEXT_SNAP_CHECK_PATH(handle, mem_ctx, service_path,
     965             :                                               base_volume);
     966           0 :         do_log(SMB_VFS_OP_SNAP_CHECK_PATH, NT_STATUS_IS_OK(status),
     967             :                handle, "");
     968             : 
     969           0 :         return status;
     970             : }
     971             : 
     972           0 : static NTSTATUS smb_full_audit_snap_create(struct vfs_handle_struct *handle,
     973             :                                            TALLOC_CTX *mem_ctx,
     974             :                                            const char *base_volume,
     975             :                                            time_t *tstamp,
     976             :                                            bool rw,
     977             :                                            char **base_path,
     978             :                                            char **snap_path)
     979             : {
     980           0 :         NTSTATUS status;
     981             : 
     982           0 :         status = SMB_VFS_NEXT_SNAP_CREATE(handle, mem_ctx, base_volume, tstamp,
     983             :                                           rw, base_path, snap_path);
     984           0 :         do_log(SMB_VFS_OP_SNAP_CREATE, NT_STATUS_IS_OK(status), handle, "");
     985             : 
     986           0 :         return status;
     987             : }
     988             : 
     989           0 : static NTSTATUS smb_full_audit_snap_delete(struct vfs_handle_struct *handle,
     990             :                                            TALLOC_CTX *mem_ctx,
     991             :                                            char *base_path,
     992             :                                            char *snap_path)
     993             : {
     994           0 :         NTSTATUS status;
     995             : 
     996           0 :         status = SMB_VFS_NEXT_SNAP_DELETE(handle, mem_ctx, base_path,
     997             :                                           snap_path);
     998           0 :         do_log(SMB_VFS_OP_SNAP_DELETE, NT_STATUS_IS_OK(status), handle, "");
     999             : 
    1000           0 :         return status;
    1001             : }
    1002             : 
    1003      155055 : static DIR *smb_full_audit_fdopendir(vfs_handle_struct *handle,
    1004             :                           files_struct *fsp, const char *mask, uint32_t attr)
    1005             : {
    1006           0 :         DIR *result;
    1007             : 
    1008      155055 :         result = SMB_VFS_NEXT_FDOPENDIR(handle, fsp, mask, attr);
    1009             : 
    1010      155055 :         do_log(SMB_VFS_OP_FDOPENDIR, (result != NULL), handle, "%s",
    1011             :                         fsp_str_do_log(fsp));
    1012             : 
    1013      155055 :         return result;
    1014             : }
    1015             : 
    1016    79844478 : static struct dirent *smb_full_audit_readdir(vfs_handle_struct *handle,
    1017             :                                              struct files_struct *dirfsp,
    1018             :                                              DIR *dirp)
    1019             : {
    1020           0 :         struct dirent *result;
    1021             : 
    1022    79844478 :         result = SMB_VFS_NEXT_READDIR(handle, dirfsp, dirp);
    1023             : 
    1024             :         /* This operation has no reasonable error condition
    1025             :          * (End of dir is also failure), so always succeed.
    1026             :          */
    1027    79844478 :         do_log(SMB_VFS_OP_READDIR, True, handle, "");
    1028             : 
    1029    79844478 :         return result;
    1030             : }
    1031             : 
    1032        1002 : static void smb_full_audit_rewinddir(vfs_handle_struct *handle,
    1033             :                         DIR *dirp)
    1034             : {
    1035        1002 :         SMB_VFS_NEXT_REWINDDIR(handle, dirp);
    1036             : 
    1037        1002 :         do_log(SMB_VFS_OP_REWINDDIR, True, handle, "");
    1038        1002 : }
    1039             : 
    1040        6210 : static int smb_full_audit_mkdirat(vfs_handle_struct *handle,
    1041             :                         struct files_struct *dirfsp,
    1042             :                         const struct smb_filename *smb_fname,
    1043             :                         mode_t mode)
    1044             : {
    1045        6210 :         struct smb_filename *full_fname = NULL;
    1046           0 :         int result;
    1047             : 
    1048        6210 :         full_fname = full_path_from_dirfsp_atname(talloc_tos(),
    1049             :                                                   dirfsp,
    1050             :                                                   smb_fname);
    1051        6210 :         if (full_fname == NULL) {
    1052           0 :                 errno = ENOMEM;
    1053           0 :                 return -1;
    1054             :         }
    1055             : 
    1056        6210 :         result = SMB_VFS_NEXT_MKDIRAT(handle,
    1057             :                         dirfsp,
    1058             :                         smb_fname,
    1059             :                         mode);
    1060             : 
    1061        6210 :         do_log(SMB_VFS_OP_MKDIRAT,
    1062             :                (result >= 0),
    1063             :                handle,
    1064             :                "%s",
    1065             :                smb_fname_str_do_log(handle->conn, full_fname));
    1066             : 
    1067        6210 :         TALLOC_FREE(full_fname);
    1068             : 
    1069        6210 :         return result;
    1070             : }
    1071             : 
    1072      155055 : static int smb_full_audit_closedir(vfs_handle_struct *handle,
    1073             :                           DIR *dirp)
    1074             : {
    1075           0 :         int result;
    1076             : 
    1077      155055 :         result = SMB_VFS_NEXT_CLOSEDIR(handle, dirp);
    1078             : 
    1079      155055 :         do_log(SMB_VFS_OP_CLOSEDIR, (result >= 0), handle, "");
    1080             : 
    1081      155055 :         return result;
    1082             : }
    1083             : 
    1084     3379502 : static int smb_full_audit_openat(vfs_handle_struct *handle,
    1085             :                                  const struct files_struct *dirfsp,
    1086             :                                  const struct smb_filename *smb_fname,
    1087             :                                  struct files_struct *fsp,
    1088             :                                  const struct vfs_open_how *how)
    1089             : {
    1090           0 :         int result;
    1091             : 
    1092     3379502 :         result = SMB_VFS_NEXT_OPENAT(handle, dirfsp, smb_fname, fsp, how);
    1093             : 
    1094     6759004 :         do_log(SMB_VFS_OP_OPENAT, (result >= 0), handle, "%s|%s",
    1095     3379502 :                ((how->flags & O_WRONLY) || (how->flags & O_RDWR))?"w":"r",
    1096             :                fsp_str_do_log(fsp));
    1097             : 
    1098     3379502 :         return result;
    1099             : }
    1100             : 
    1101      281891 : static NTSTATUS smb_full_audit_create_file(vfs_handle_struct *handle,
    1102             :                                       struct smb_request *req,
    1103             :                                       struct files_struct *dirfsp,
    1104             :                                       struct smb_filename *smb_fname,
    1105             :                                       uint32_t access_mask,
    1106             :                                       uint32_t share_access,
    1107             :                                       uint32_t create_disposition,
    1108             :                                       uint32_t create_options,
    1109             :                                       uint32_t file_attributes,
    1110             :                                       uint32_t oplock_request,
    1111             :                                       const struct smb2_lease *lease,
    1112             :                                       uint64_t allocation_size,
    1113             :                                       uint32_t private_flags,
    1114             :                                       struct security_descriptor *sd,
    1115             :                                       struct ea_list *ea_list,
    1116             :                                       files_struct **result_fsp,
    1117             :                                       int *pinfo,
    1118             :                                       const struct smb2_create_blobs *in_context_blobs,
    1119             :                                       struct smb2_create_blobs *out_context_blobs)
    1120             : {
    1121           0 :         NTSTATUS result;
    1122           0 :         const char* str_create_disposition;
    1123             : 
    1124      281891 :         switch (create_disposition) {
    1125          80 :         case FILE_SUPERSEDE:
    1126          80 :                 str_create_disposition = "supersede";
    1127          80 :                 break;
    1128        5449 :         case FILE_OVERWRITE_IF:
    1129        5449 :                 str_create_disposition = "overwrite_if";
    1130        5449 :                 break;
    1131      190498 :         case FILE_OPEN:
    1132      190498 :                 str_create_disposition = "open";
    1133      190498 :                 break;
    1134        1134 :         case FILE_OVERWRITE:
    1135        1134 :                 str_create_disposition = "overwrite";
    1136        1134 :                 break;
    1137       71465 :         case FILE_CREATE:
    1138       71465 :                 str_create_disposition = "create";
    1139       71465 :                 break;
    1140       13247 :         case FILE_OPEN_IF:
    1141       13247 :                 str_create_disposition = "open_if";
    1142       13247 :                 break;
    1143          18 :         default:
    1144          18 :                 str_create_disposition = "unknown";
    1145             :         }
    1146             : 
    1147      281891 :         result = SMB_VFS_NEXT_CREATE_FILE(
    1148             :                 handle,                                 /* handle */
    1149             :                 req,                                    /* req */
    1150             :                 dirfsp,                                 /* dirfsp */
    1151             :                 smb_fname,                              /* fname */
    1152             :                 access_mask,                            /* access_mask */
    1153             :                 share_access,                           /* share_access */
    1154             :                 create_disposition,                     /* create_disposition*/
    1155             :                 create_options,                         /* create_options */
    1156             :                 file_attributes,                        /* file_attributes */
    1157             :                 oplock_request,                         /* oplock_request */
    1158             :                 lease,                                  /* lease */
    1159             :                 allocation_size,                        /* allocation_size */
    1160             :                 private_flags,
    1161             :                 sd,                                     /* sd */
    1162             :                 ea_list,                                /* ea_list */
    1163             :                 result_fsp,                             /* result */
    1164             :                 pinfo,                                  /* pinfo */
    1165             :                 in_context_blobs, out_context_blobs);   /* create context */
    1166             : 
    1167      563782 :         do_log(SMB_VFS_OP_CREATE_FILE, (NT_STATUS_IS_OK(result)), handle,
    1168             :                "0x%x|%s|%s|%s", access_mask,
    1169      281891 :                create_options & FILE_DIRECTORY_FILE ? "dir" : "file",
    1170             :                str_create_disposition,
    1171             :                 smb_fname_str_do_log(handle->conn, smb_fname));
    1172             : 
    1173      281891 :         return result;
    1174             : }
    1175             : 
    1176     2228960 : static int smb_full_audit_close(vfs_handle_struct *handle, files_struct *fsp)
    1177             : {
    1178           0 :         int result;
    1179             : 
    1180     2228960 :         result = SMB_VFS_NEXT_CLOSE(handle, fsp);
    1181             : 
    1182     2228960 :         do_log(SMB_VFS_OP_CLOSE, (result >= 0), handle, "%s",
    1183             :                fsp_str_do_log(fsp));
    1184             : 
    1185     2228960 :         return result;
    1186             : }
    1187             : 
    1188        1842 : static ssize_t smb_full_audit_pread(vfs_handle_struct *handle, files_struct *fsp,
    1189             :                            void *data, size_t n, off_t offset)
    1190             : {
    1191           0 :         ssize_t result;
    1192             : 
    1193        1842 :         result = SMB_VFS_NEXT_PREAD(handle, fsp, data, n, offset);
    1194             : 
    1195        1842 :         do_log(SMB_VFS_OP_PREAD, (result >= 0), handle, "%s",
    1196             :                fsp_str_do_log(fsp));
    1197             : 
    1198        1842 :         return result;
    1199             : }
    1200             : 
    1201             : struct smb_full_audit_pread_state {
    1202             :         vfs_handle_struct *handle;
    1203             :         files_struct *fsp;
    1204             :         ssize_t ret;
    1205             :         struct vfs_aio_state vfs_aio_state;
    1206             : };
    1207             : 
    1208             : static void smb_full_audit_pread_done(struct tevent_req *subreq);
    1209             : 
    1210        9482 : static struct tevent_req *smb_full_audit_pread_send(
    1211             :         struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx,
    1212             :         struct tevent_context *ev, struct files_struct *fsp,
    1213             :         void *data, size_t n, off_t offset)
    1214             : {
    1215           0 :         struct tevent_req *req, *subreq;
    1216           0 :         struct smb_full_audit_pread_state *state;
    1217             : 
    1218        9482 :         req = tevent_req_create(mem_ctx, &state,
    1219             :                                 struct smb_full_audit_pread_state);
    1220        9482 :         if (req == NULL) {
    1221           0 :                 do_log(SMB_VFS_OP_PREAD_SEND, false, handle, "%s",
    1222             :                        fsp_str_do_log(fsp));
    1223           0 :                 return NULL;
    1224             :         }
    1225        9482 :         state->handle = handle;
    1226        9482 :         state->fsp = fsp;
    1227             : 
    1228        9482 :         subreq = SMB_VFS_NEXT_PREAD_SEND(state, ev, handle, fsp, data,
    1229             :                                          n, offset);
    1230        9482 :         if (tevent_req_nomem(subreq, req)) {
    1231           0 :                 do_log(SMB_VFS_OP_PREAD_SEND, false, handle, "%s",
    1232             :                        fsp_str_do_log(fsp));
    1233           0 :                 return tevent_req_post(req, ev);
    1234             :         }
    1235        9482 :         tevent_req_set_callback(subreq, smb_full_audit_pread_done, req);
    1236             : 
    1237        9482 :         do_log(SMB_VFS_OP_PREAD_SEND, true, handle, "%s", fsp_str_do_log(fsp));
    1238        9482 :         return req;
    1239             : }
    1240             : 
    1241        9482 : static void smb_full_audit_pread_done(struct tevent_req *subreq)
    1242             : {
    1243        9482 :         struct tevent_req *req = tevent_req_callback_data(
    1244             :                 subreq, struct tevent_req);
    1245        9482 :         struct smb_full_audit_pread_state *state = tevent_req_data(
    1246             :                 req, struct smb_full_audit_pread_state);
    1247             : 
    1248        9482 :         state->ret = SMB_VFS_PREAD_RECV(subreq, &state->vfs_aio_state);
    1249        9482 :         TALLOC_FREE(subreq);
    1250        9482 :         tevent_req_done(req);
    1251        9482 : }
    1252             : 
    1253        9482 : static ssize_t smb_full_audit_pread_recv(struct tevent_req *req,
    1254             :                                          struct vfs_aio_state *vfs_aio_state)
    1255             : {
    1256        9482 :         struct smb_full_audit_pread_state *state = tevent_req_data(
    1257             :                 req, struct smb_full_audit_pread_state);
    1258             : 
    1259        9482 :         if (tevent_req_is_unix_error(req, &vfs_aio_state->error)) {
    1260           0 :                 do_log(SMB_VFS_OP_PREAD_RECV, false, state->handle, "%s",
    1261           0 :                        fsp_str_do_log(state->fsp));
    1262           0 :                 return -1;
    1263             :         }
    1264             : 
    1265        9482 :         do_log(SMB_VFS_OP_PREAD_RECV, (state->ret >= 0), state->handle, "%s",
    1266        9482 :                fsp_str_do_log(state->fsp));
    1267             : 
    1268        9482 :         *vfs_aio_state = state->vfs_aio_state;
    1269        9482 :         return state->ret;
    1270             : }
    1271             : 
    1272         230 : static ssize_t smb_full_audit_pwrite(vfs_handle_struct *handle, files_struct *fsp,
    1273             :                             const void *data, size_t n,
    1274             :                             off_t offset)
    1275             : {
    1276           0 :         ssize_t result;
    1277             : 
    1278         230 :         result = SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset);
    1279             : 
    1280         230 :         do_log(SMB_VFS_OP_PWRITE, (result >= 0), handle, "%s",
    1281             :                fsp_str_do_log(fsp));
    1282             : 
    1283         230 :         return result;
    1284             : }
    1285             : 
    1286             : struct smb_full_audit_pwrite_state {
    1287             :         vfs_handle_struct *handle;
    1288             :         files_struct *fsp;
    1289             :         ssize_t ret;
    1290             :         struct vfs_aio_state vfs_aio_state;
    1291             : };
    1292             : 
    1293             : static void smb_full_audit_pwrite_done(struct tevent_req *subreq);
    1294             : 
    1295      116306 : static struct tevent_req *smb_full_audit_pwrite_send(
    1296             :         struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx,
    1297             :         struct tevent_context *ev, struct files_struct *fsp,
    1298             :         const void *data, size_t n, off_t offset)
    1299             : {
    1300           0 :         struct tevent_req *req, *subreq;
    1301           0 :         struct smb_full_audit_pwrite_state *state;
    1302             : 
    1303      116306 :         req = tevent_req_create(mem_ctx, &state,
    1304             :                                 struct smb_full_audit_pwrite_state);
    1305      116306 :         if (req == NULL) {
    1306           0 :                 do_log(SMB_VFS_OP_PWRITE_SEND, false, handle, "%s",
    1307             :                        fsp_str_do_log(fsp));
    1308           0 :                 return NULL;
    1309             :         }
    1310      116306 :         state->handle = handle;
    1311      116306 :         state->fsp = fsp;
    1312             : 
    1313      116306 :         subreq = SMB_VFS_NEXT_PWRITE_SEND(state, ev, handle, fsp, data,
    1314             :                                          n, offset);
    1315      116306 :         if (tevent_req_nomem(subreq, req)) {
    1316           0 :                 do_log(SMB_VFS_OP_PWRITE_SEND, false, handle, "%s",
    1317             :                        fsp_str_do_log(fsp));
    1318           0 :                 return tevent_req_post(req, ev);
    1319             :         }
    1320      116306 :         tevent_req_set_callback(subreq, smb_full_audit_pwrite_done, req);
    1321             : 
    1322      116306 :         do_log(SMB_VFS_OP_PWRITE_SEND, true, handle, "%s",
    1323             :                fsp_str_do_log(fsp));
    1324      116306 :         return req;
    1325             : }
    1326             : 
    1327      116306 : static void smb_full_audit_pwrite_done(struct tevent_req *subreq)
    1328             : {
    1329      116306 :         struct tevent_req *req = tevent_req_callback_data(
    1330             :                 subreq, struct tevent_req);
    1331      116306 :         struct smb_full_audit_pwrite_state *state = tevent_req_data(
    1332             :                 req, struct smb_full_audit_pwrite_state);
    1333             : 
    1334      116306 :         state->ret = SMB_VFS_PWRITE_RECV(subreq, &state->vfs_aio_state);
    1335      116306 :         TALLOC_FREE(subreq);
    1336      116306 :         tevent_req_done(req);
    1337      116306 : }
    1338             : 
    1339      116306 : static ssize_t smb_full_audit_pwrite_recv(struct tevent_req *req,
    1340             :                                           struct vfs_aio_state *vfs_aio_state)
    1341             : {
    1342      116306 :         struct smb_full_audit_pwrite_state *state = tevent_req_data(
    1343             :                 req, struct smb_full_audit_pwrite_state);
    1344             : 
    1345      116306 :         if (tevent_req_is_unix_error(req, &vfs_aio_state->error)) {
    1346           0 :                 do_log(SMB_VFS_OP_PWRITE_RECV, false, state->handle, "%s",
    1347           0 :                        fsp_str_do_log(state->fsp));
    1348           0 :                 return -1;
    1349             :         }
    1350             : 
    1351      116306 :         do_log(SMB_VFS_OP_PWRITE_RECV, (state->ret >= 0), state->handle, "%s",
    1352      116306 :                fsp_str_do_log(state->fsp));
    1353             : 
    1354      116306 :         *vfs_aio_state = state->vfs_aio_state;
    1355      116306 :         return state->ret;
    1356             : }
    1357             : 
    1358         332 : static off_t smb_full_audit_lseek(vfs_handle_struct *handle, files_struct *fsp,
    1359             :                              off_t offset, int whence)
    1360             : {
    1361           0 :         ssize_t result;
    1362             : 
    1363         332 :         result = SMB_VFS_NEXT_LSEEK(handle, fsp, offset, whence);
    1364             : 
    1365         332 :         do_log(SMB_VFS_OP_LSEEK, (result != (ssize_t)-1), handle,
    1366             :                "%s", fsp_str_do_log(fsp));
    1367             : 
    1368         332 :         return result;
    1369             : }
    1370             : 
    1371           0 : static ssize_t smb_full_audit_sendfile(vfs_handle_struct *handle, int tofd,
    1372             :                               files_struct *fromfsp,
    1373             :                               const DATA_BLOB *hdr, off_t offset,
    1374             :                               size_t n)
    1375             : {
    1376           0 :         ssize_t result;
    1377             : 
    1378           0 :         result = SMB_VFS_NEXT_SENDFILE(handle, tofd, fromfsp, hdr, offset, n);
    1379             : 
    1380           0 :         do_log(SMB_VFS_OP_SENDFILE, (result >= 0), handle,
    1381             :                "%s", fsp_str_do_log(fromfsp));
    1382             : 
    1383           0 :         return result;
    1384             : }
    1385             : 
    1386           0 : static ssize_t smb_full_audit_recvfile(vfs_handle_struct *handle, int fromfd,
    1387             :                       files_struct *tofsp,
    1388             :                               off_t offset,
    1389             :                               size_t n)
    1390             : {
    1391           0 :         ssize_t result;
    1392             : 
    1393           0 :         result = SMB_VFS_NEXT_RECVFILE(handle, fromfd, tofsp, offset, n);
    1394             : 
    1395           0 :         do_log(SMB_VFS_OP_RECVFILE, (result >= 0), handle,
    1396             :                "%s", fsp_str_do_log(tofsp));
    1397             : 
    1398           0 :         return result;
    1399             : }
    1400             : 
    1401         660 : static int smb_full_audit_renameat(vfs_handle_struct *handle,
    1402             :                                 files_struct *srcfsp,
    1403             :                                 const struct smb_filename *smb_fname_src,
    1404             :                                 files_struct *dstfsp,
    1405             :                                 const struct smb_filename *smb_fname_dst)
    1406             : {
    1407           0 :         int result;
    1408           0 :         int saved_errno;
    1409         660 :         struct smb_filename *full_fname_src = NULL;
    1410         660 :         struct smb_filename *full_fname_dst = NULL;
    1411             : 
    1412         660 :         full_fname_src = full_path_from_dirfsp_atname(talloc_tos(),
    1413             :                                                       srcfsp,
    1414             :                                                       smb_fname_src);
    1415         660 :         if (full_fname_src == NULL) {
    1416           0 :                 errno = ENOMEM;
    1417           0 :                 return -1;
    1418             :         }
    1419         660 :         full_fname_dst = full_path_from_dirfsp_atname(talloc_tos(),
    1420             :                                                       dstfsp,
    1421             :                                                       smb_fname_dst);
    1422         660 :         if (full_fname_dst == NULL) {
    1423           0 :                 TALLOC_FREE(full_fname_src);
    1424           0 :                 errno = ENOMEM;
    1425           0 :                 return -1;
    1426             :         }
    1427             : 
    1428         660 :         result = SMB_VFS_NEXT_RENAMEAT(handle,
    1429             :                                 srcfsp,
    1430             :                                 smb_fname_src,
    1431             :                                 dstfsp,
    1432             :                                 smb_fname_dst);
    1433             : 
    1434         660 :         if (result == -1) {
    1435           0 :                 saved_errno = errno;
    1436             :         }
    1437         660 :         do_log(SMB_VFS_OP_RENAMEAT, (result >= 0), handle, "%s|%s",
    1438             :                smb_fname_str_do_log(handle->conn, full_fname_src),
    1439             :                smb_fname_str_do_log(handle->conn, full_fname_dst));
    1440             : 
    1441         660 :         TALLOC_FREE(full_fname_src);
    1442         660 :         TALLOC_FREE(full_fname_dst);
    1443             : 
    1444         660 :         if (result == -1) {
    1445           0 :                 errno = saved_errno;
    1446             :         }
    1447         660 :         return result;
    1448             : }
    1449             : 
    1450             : struct smb_full_audit_fsync_state {
    1451             :         vfs_handle_struct *handle;
    1452             :         files_struct *fsp;
    1453             :         int ret;
    1454             :         struct vfs_aio_state vfs_aio_state;
    1455             : };
    1456             : 
    1457             : static void smb_full_audit_fsync_done(struct tevent_req *subreq);
    1458             : 
    1459         118 : static struct tevent_req *smb_full_audit_fsync_send(
    1460             :         struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx,
    1461             :         struct tevent_context *ev, struct files_struct *fsp)
    1462             : {
    1463           0 :         struct tevent_req *req, *subreq;
    1464           0 :         struct smb_full_audit_fsync_state *state;
    1465             : 
    1466         118 :         req = tevent_req_create(mem_ctx, &state,
    1467             :                                 struct smb_full_audit_fsync_state);
    1468         118 :         if (req == NULL) {
    1469           0 :                 do_log(SMB_VFS_OP_FSYNC_SEND, false, handle, "%s",
    1470             :                        fsp_str_do_log(fsp));
    1471           0 :                 return NULL;
    1472             :         }
    1473         118 :         state->handle = handle;
    1474         118 :         state->fsp = fsp;
    1475             : 
    1476         118 :         subreq = SMB_VFS_NEXT_FSYNC_SEND(state, ev, handle, fsp);
    1477         118 :         if (tevent_req_nomem(subreq, req)) {
    1478           0 :                 do_log(SMB_VFS_OP_FSYNC_SEND, false, handle, "%s",
    1479             :                        fsp_str_do_log(fsp));
    1480           0 :                 return tevent_req_post(req, ev);
    1481             :         }
    1482         118 :         tevent_req_set_callback(subreq, smb_full_audit_fsync_done, req);
    1483             : 
    1484         118 :         do_log(SMB_VFS_OP_FSYNC_SEND, true, handle, "%s", fsp_str_do_log(fsp));
    1485         118 :         return req;
    1486             : }
    1487             : 
    1488         118 : static void smb_full_audit_fsync_done(struct tevent_req *subreq)
    1489             : {
    1490         118 :         struct tevent_req *req = tevent_req_callback_data(
    1491             :                 subreq, struct tevent_req);
    1492         118 :         struct smb_full_audit_fsync_state *state = tevent_req_data(
    1493             :                 req, struct smb_full_audit_fsync_state);
    1494             : 
    1495         118 :         state->ret = SMB_VFS_FSYNC_RECV(subreq, &state->vfs_aio_state);
    1496         118 :         TALLOC_FREE(subreq);
    1497         118 :         tevent_req_done(req);
    1498         118 : }
    1499             : 
    1500         118 : static int smb_full_audit_fsync_recv(struct tevent_req *req,
    1501             :                                      struct vfs_aio_state *vfs_aio_state)
    1502             : {
    1503         118 :         struct smb_full_audit_fsync_state *state = tevent_req_data(
    1504             :                 req, struct smb_full_audit_fsync_state);
    1505             : 
    1506         118 :         if (tevent_req_is_unix_error(req, &vfs_aio_state->error)) {
    1507           0 :                 do_log(SMB_VFS_OP_FSYNC_RECV, false, state->handle, "%s",
    1508           0 :                        fsp_str_do_log(state->fsp));
    1509           0 :                 return -1;
    1510             :         }
    1511             : 
    1512         118 :         do_log(SMB_VFS_OP_FSYNC_RECV, (state->ret >= 0), state->handle, "%s",
    1513         118 :                fsp_str_do_log(state->fsp));
    1514             : 
    1515         118 :         *vfs_aio_state = state->vfs_aio_state;
    1516         118 :         return state->ret;
    1517             : }
    1518             : 
    1519     3141217 : static int smb_full_audit_stat(vfs_handle_struct *handle,
    1520             :                                struct smb_filename *smb_fname)
    1521             : {
    1522           0 :         int result;
    1523             : 
    1524     3141217 :         result = SMB_VFS_NEXT_STAT(handle, smb_fname);
    1525             : 
    1526     3141217 :         do_log(SMB_VFS_OP_STAT, (result >= 0), handle, "%s",
    1527             :                smb_fname_str_do_log(handle->conn, smb_fname));
    1528             : 
    1529     3141217 :         return result;
    1530             : }
    1531             : 
    1532    16278057 : static int smb_full_audit_fstat(vfs_handle_struct *handle, files_struct *fsp,
    1533             :                        SMB_STRUCT_STAT *sbuf)
    1534             : {
    1535           0 :         int result;
    1536             : 
    1537    16278057 :         result = SMB_VFS_NEXT_FSTAT(handle, fsp, sbuf);
    1538             : 
    1539    16278057 :         do_log(SMB_VFS_OP_FSTAT, (result >= 0), handle, "%s",
    1540             :                fsp_str_do_log(fsp));
    1541             : 
    1542    16278057 :         return result;
    1543             : }
    1544             : 
    1545        8003 : static int smb_full_audit_lstat(vfs_handle_struct *handle,
    1546             :                                 struct smb_filename *smb_fname)
    1547             : {
    1548           0 :         int result;
    1549             : 
    1550        8003 :         result = SMB_VFS_NEXT_LSTAT(handle, smb_fname);
    1551             : 
    1552        8003 :         do_log(SMB_VFS_OP_LSTAT, (result >= 0), handle, "%s",
    1553             :                smb_fname_str_do_log(handle->conn, smb_fname));
    1554             : 
    1555        8003 :         return result;
    1556             : }
    1557             : 
    1558       36612 : static int smb_full_audit_fstatat(
    1559             :         struct vfs_handle_struct *handle,
    1560             :         const struct files_struct *dirfsp,
    1561             :         const struct smb_filename *smb_fname,
    1562             :         SMB_STRUCT_STAT *sbuf,
    1563             :         int flags)
    1564             : {
    1565           0 :         int result;
    1566             : 
    1567       36612 :         result = SMB_VFS_NEXT_FSTATAT(handle, dirfsp, smb_fname, sbuf, flags);
    1568             : 
    1569       36612 :         do_log(SMB_VFS_OP_FSTATAT,
    1570             :                (result >= 0),
    1571             :                handle,
    1572             :                "%s/%s",
    1573             :                fsp_str_do_log(dirfsp),
    1574             :                smb_fname_str_do_log(handle->conn, smb_fname));
    1575             : 
    1576       36612 :         return result;
    1577             : }
    1578      846384 : static uint64_t smb_full_audit_get_alloc_size(vfs_handle_struct *handle,
    1579             :                        files_struct *fsp, const SMB_STRUCT_STAT *sbuf)
    1580             : {
    1581           0 :         uint64_t result;
    1582             : 
    1583      846384 :         result = SMB_VFS_NEXT_GET_ALLOC_SIZE(handle, fsp, sbuf);
    1584             : 
    1585      846384 :         do_log(SMB_VFS_OP_GET_ALLOC_SIZE, (result != (uint64_t)-1), handle,
    1586             :                         "%llu", (unsigned long long)result);
    1587             : 
    1588      846384 :         return result;
    1589             : }
    1590             : 
    1591       84751 : static int smb_full_audit_unlinkat(vfs_handle_struct *handle,
    1592             :                         struct files_struct *dirfsp,
    1593             :                         const struct smb_filename *smb_fname,
    1594             :                         int flags)
    1595             : {
    1596       84751 :         struct smb_filename *full_fname = NULL;
    1597           0 :         int result;
    1598             : 
    1599       84751 :         full_fname = full_path_from_dirfsp_atname(talloc_tos(),
    1600             :                                                   dirfsp,
    1601             :                                                   smb_fname);
    1602       84751 :         if (full_fname == NULL) {
    1603           0 :                 return -1;
    1604             :         }
    1605             : 
    1606       84751 :         result = SMB_VFS_NEXT_UNLINKAT(handle,
    1607             :                         dirfsp,
    1608             :                         smb_fname,
    1609             :                         flags);
    1610             : 
    1611       84751 :         do_log(SMB_VFS_OP_UNLINKAT, (result >= 0), handle, "%s",
    1612             :                smb_fname_str_do_log(handle->conn, full_fname));
    1613             : 
    1614       84751 :         TALLOC_FREE(full_fname);
    1615       84751 :         return result;
    1616             : }
    1617             : 
    1618          12 : static int smb_full_audit_fchmod(vfs_handle_struct *handle, files_struct *fsp,
    1619             :                         mode_t mode)
    1620             : {
    1621           0 :         int result;
    1622             : 
    1623          12 :         result = SMB_VFS_NEXT_FCHMOD(handle, fsp, mode);
    1624             : 
    1625          12 :         do_log(SMB_VFS_OP_FCHMOD, (result >= 0), handle,
    1626             :                "%s|%o", fsp_str_do_log(fsp), mode);
    1627             : 
    1628          12 :         return result;
    1629             : }
    1630             : 
    1631           0 : static int smb_full_audit_fchown(vfs_handle_struct *handle, files_struct *fsp,
    1632             :                         uid_t uid, gid_t gid)
    1633             : {
    1634           0 :         int result;
    1635             : 
    1636           0 :         result = SMB_VFS_NEXT_FCHOWN(handle, fsp, uid, gid);
    1637             : 
    1638           0 :         do_log(SMB_VFS_OP_FCHOWN, (result >= 0), handle, "%s|%ld|%ld",
    1639             :                fsp_str_do_log(fsp), (long int)uid, (long int)gid);
    1640             : 
    1641           0 :         return result;
    1642             : }
    1643             : 
    1644           0 : static int smb_full_audit_lchown(vfs_handle_struct *handle,
    1645             :                         const struct smb_filename *smb_fname,
    1646             :                         uid_t uid,
    1647             :                         gid_t gid)
    1648             : {
    1649           0 :         int result;
    1650             : 
    1651           0 :         result = SMB_VFS_NEXT_LCHOWN(handle, smb_fname, uid, gid);
    1652             : 
    1653           0 :         do_log(SMB_VFS_OP_LCHOWN, (result >= 0), handle, "%s|%ld|%ld",
    1654           0 :                smb_fname->base_name, (long int)uid, (long int)gid);
    1655             : 
    1656           0 :         return result;
    1657             : }
    1658             : 
    1659     1019305 : static int smb_full_audit_chdir(vfs_handle_struct *handle,
    1660             :                         const struct smb_filename *smb_fname)
    1661             : {
    1662           0 :         int result;
    1663             : 
    1664     1019305 :         result = SMB_VFS_NEXT_CHDIR(handle, smb_fname);
    1665             : 
    1666     1019305 :         do_log(SMB_VFS_OP_CHDIR,
    1667             :                (result >= 0),
    1668             :                handle,
    1669             :                "chdir|%s",
    1670             :                smb_fname_str_do_log(handle->conn, smb_fname));
    1671             : 
    1672     1019305 :         return result;
    1673             : }
    1674             : 
    1675       51449 : static struct smb_filename *smb_full_audit_getwd(vfs_handle_struct *handle,
    1676             :                                 TALLOC_CTX *ctx)
    1677             : {
    1678           0 :         struct smb_filename *result;
    1679             : 
    1680       51449 :         result = SMB_VFS_NEXT_GETWD(handle, ctx);
    1681             : 
    1682       51449 :         do_log(SMB_VFS_OP_GETWD, (result != NULL), handle, "%s",
    1683             :                 result == NULL? "" : result->base_name);
    1684             : 
    1685       51449 :         return result;
    1686             : }
    1687             : 
    1688        6854 : static int smb_full_audit_fntimes(vfs_handle_struct *handle,
    1689             :                                   files_struct *fsp,
    1690             :                                   struct smb_file_time *ft)
    1691             : {
    1692           0 :         int result;
    1693        6854 :         time_t create_time = convert_timespec_to_time_t(ft->create_time);
    1694        6854 :         time_t atime = convert_timespec_to_time_t(ft->atime);
    1695        6854 :         time_t mtime = convert_timespec_to_time_t(ft->mtime);
    1696        6854 :         time_t ctime = convert_timespec_to_time_t(ft->ctime);
    1697        6854 :         const char *create_time_str = "";
    1698        6854 :         const char *atime_str = "";
    1699        6854 :         const char *mtime_str = "";
    1700        6854 :         const char *ctime_str = "";
    1701        6854 :         TALLOC_CTX *frame = talloc_stackframe();
    1702             : 
    1703        6854 :         if (frame == NULL) {
    1704           0 :                 errno = ENOMEM;
    1705           0 :                 return -1;
    1706             :         }
    1707             : 
    1708        6854 :         result = SMB_VFS_NEXT_FNTIMES(handle, fsp, ft);
    1709             : 
    1710        6854 :         if (create_time > 0) {
    1711        6846 :                 create_time_str = timestring(frame, create_time);
    1712             :         }
    1713        6854 :         if (atime > 0) {
    1714        6854 :                 atime_str = timestring(frame, atime);
    1715             :         }
    1716        6854 :         if (mtime > 0) {
    1717        6838 :                 mtime_str = timestring(frame, mtime);
    1718             :         }
    1719        6854 :         if (ctime > 0) {
    1720        6846 :                 ctime_str = timestring(frame, ctime);
    1721             :         }
    1722             : 
    1723        6854 :         do_log(SMB_VFS_OP_FNTIMES,
    1724             :                (result >= 0),
    1725             :                handle,
    1726             :                "%s|%s|%s|%s|%s",
    1727             :                fsp_str_do_log(fsp),
    1728             :                create_time_str,
    1729             :                atime_str,
    1730             :                mtime_str,
    1731             :                ctime_str);
    1732             : 
    1733        6854 :         TALLOC_FREE(frame);
    1734             : 
    1735        6854 :         return result;
    1736             : }
    1737             : 
    1738         478 : static int smb_full_audit_ftruncate(vfs_handle_struct *handle, files_struct *fsp,
    1739             :                            off_t len)
    1740             : {
    1741           0 :         int result;
    1742             : 
    1743         478 :         result = SMB_VFS_NEXT_FTRUNCATE(handle, fsp, len);
    1744             : 
    1745         478 :         do_log(SMB_VFS_OP_FTRUNCATE, (result >= 0), handle,
    1746             :                "%s", fsp_str_do_log(fsp));
    1747             : 
    1748         478 :         return result;
    1749             : }
    1750             : 
    1751         140 : static int smb_full_audit_fallocate(vfs_handle_struct *handle, files_struct *fsp,
    1752             :                            uint32_t mode,
    1753             :                            off_t offset,
    1754             :                            off_t len)
    1755             : {
    1756           0 :         int result;
    1757             : 
    1758         140 :         result = SMB_VFS_NEXT_FALLOCATE(handle, fsp, mode, offset, len);
    1759             : 
    1760         140 :         do_log(SMB_VFS_OP_FALLOCATE, (result >= 0), handle,
    1761             :                "%s", fsp_str_do_log(fsp));
    1762             : 
    1763         140 :         return result;
    1764             : }
    1765             : 
    1766        4078 : static bool smb_full_audit_lock(vfs_handle_struct *handle, files_struct *fsp,
    1767             :                        int op, off_t offset, off_t count, int type)
    1768             : {
    1769           0 :         bool result;
    1770             : 
    1771        4078 :         result = SMB_VFS_NEXT_LOCK(handle, fsp, op, offset, count, type);
    1772             : 
    1773        4078 :         do_log(SMB_VFS_OP_LOCK, result, handle, "%s", fsp_str_do_log(fsp));
    1774             : 
    1775        4078 :         return result;
    1776             : }
    1777             : 
    1778           0 : static int smb_full_audit_filesystem_sharemode(struct vfs_handle_struct *handle,
    1779             :                                                struct files_struct *fsp,
    1780             :                                                uint32_t share_access,
    1781             :                                                uint32_t access_mask)
    1782             : {
    1783           0 :         int result;
    1784             : 
    1785           0 :         result = SMB_VFS_NEXT_FILESYSTEM_SHAREMODE(handle,
    1786             :                                                    fsp,
    1787             :                                                    share_access,
    1788             :                                                    access_mask);
    1789             : 
    1790           0 :         do_log(SMB_VFS_OP_FILESYSTEM_SHAREMODE, (result >= 0), handle, "%s",
    1791             :                fsp_str_do_log(fsp));
    1792             : 
    1793           0 :         return result;
    1794             : }
    1795             : 
    1796      190372 : static int smb_full_audit_fcntl(struct vfs_handle_struct *handle,
    1797             :                                 struct files_struct *fsp,
    1798             :                                 int cmd, va_list cmd_arg)
    1799             : {
    1800           0 :         void *arg;
    1801           0 :         va_list dup_cmd_arg;
    1802           0 :         int result;
    1803             : 
    1804      190372 :         va_copy(dup_cmd_arg, cmd_arg);
    1805      190372 :         arg = va_arg(dup_cmd_arg, void *);
    1806      190372 :         result = SMB_VFS_NEXT_FCNTL(handle, fsp, cmd, arg);
    1807      190372 :         va_end(dup_cmd_arg);
    1808             : 
    1809      190372 :         do_log(SMB_VFS_OP_FCNTL, (result >= 0), handle, "%s",
    1810             :                fsp_str_do_log(fsp));
    1811             : 
    1812      190372 :         return result;
    1813             : }
    1814             : 
    1815           0 : static int smb_full_audit_linux_setlease(vfs_handle_struct *handle, files_struct *fsp,
    1816             :                                  int leasetype)
    1817             : {
    1818           0 :         int result;
    1819             : 
    1820           0 :         result = SMB_VFS_NEXT_LINUX_SETLEASE(handle, fsp, leasetype);
    1821             : 
    1822           0 :         do_log(SMB_VFS_OP_LINUX_SETLEASE, (result >= 0), handle, "%s",
    1823             :                fsp_str_do_log(fsp));
    1824             : 
    1825           0 :         return result;
    1826             : }
    1827             : 
    1828      125738 : static bool smb_full_audit_getlock(vfs_handle_struct *handle, files_struct *fsp,
    1829             :                        off_t *poffset, off_t *pcount, int *ptype, pid_t *ppid)
    1830             : {
    1831           0 :         bool result;
    1832             : 
    1833      125738 :         result = SMB_VFS_NEXT_GETLOCK(handle, fsp, poffset, pcount, ptype, ppid);
    1834             : 
    1835      125738 :         do_log(SMB_VFS_OP_GETLOCK, result, handle, "%s", fsp_str_do_log(fsp));
    1836             : 
    1837      125738 :         return result;
    1838             : }
    1839             : 
    1840          16 : static int smb_full_audit_symlinkat(vfs_handle_struct *handle,
    1841             :                         const struct smb_filename *link_contents,
    1842             :                         struct files_struct *dirfsp,
    1843             :                         const struct smb_filename *new_smb_fname)
    1844             : {
    1845          16 :         struct smb_filename *full_fname = NULL;
    1846           0 :         int result;
    1847             : 
    1848          16 :         full_fname = full_path_from_dirfsp_atname(talloc_tos(),
    1849             :                                                 dirfsp,
    1850             :                                                 new_smb_fname);
    1851          16 :         if (full_fname == NULL) {
    1852           0 :                 return -1;
    1853             :         }
    1854             : 
    1855          16 :         result = SMB_VFS_NEXT_SYMLINKAT(handle,
    1856             :                                 link_contents,
    1857             :                                 dirfsp,
    1858             :                                 new_smb_fname);
    1859             : 
    1860          16 :         do_log(SMB_VFS_OP_SYMLINKAT,
    1861             :                (result >= 0),
    1862             :                handle,
    1863             :                "%s|%s",
    1864          16 :                link_contents->base_name,
    1865             :                smb_fname_str_do_log(handle->conn, full_fname));
    1866             : 
    1867          16 :         TALLOC_FREE(full_fname);
    1868             : 
    1869          16 :         return result;
    1870             : }
    1871             : 
    1872       70635 : static int smb_full_audit_readlinkat(vfs_handle_struct *handle,
    1873             :                         const struct files_struct *dirfsp,
    1874             :                         const struct smb_filename *smb_fname,
    1875             :                         char *buf,
    1876             :                         size_t bufsiz)
    1877             : {
    1878       70635 :         struct smb_filename *full_fname = NULL;
    1879           0 :         int result;
    1880             : 
    1881       70635 :         full_fname = full_path_from_dirfsp_atname(talloc_tos(),
    1882             :                                                 dirfsp,
    1883             :                                                 smb_fname);
    1884       70635 :         if (full_fname == NULL) {
    1885           0 :                 return -1;
    1886             :         }
    1887             : 
    1888       70635 :         result = SMB_VFS_NEXT_READLINKAT(handle,
    1889             :                         dirfsp,
    1890             :                         smb_fname,
    1891             :                         buf,
    1892             :                         bufsiz);
    1893             : 
    1894       70635 :         do_log(SMB_VFS_OP_READLINKAT,
    1895             :                (result >= 0),
    1896             :                handle,
    1897             :                "%s",
    1898             :                smb_fname_str_do_log(handle->conn, full_fname));
    1899             : 
    1900       70635 :         TALLOC_FREE(full_fname);
    1901             : 
    1902       70635 :         return result;
    1903             : }
    1904             : 
    1905          32 : static int smb_full_audit_linkat(vfs_handle_struct *handle,
    1906             :                         files_struct *srcfsp,
    1907             :                         const struct smb_filename *old_smb_fname,
    1908             :                         files_struct *dstfsp,
    1909             :                         const struct smb_filename *new_smb_fname,
    1910             :                         int flags)
    1911             : {
    1912          32 :         struct smb_filename *old_full_fname = NULL;
    1913          32 :         struct smb_filename *new_full_fname = NULL;
    1914           0 :         int result;
    1915             : 
    1916          32 :         old_full_fname = full_path_from_dirfsp_atname(talloc_tos(),
    1917             :                                                 srcfsp,
    1918             :                                                 old_smb_fname);
    1919          32 :         if (old_full_fname == NULL) {
    1920           0 :                 return -1;
    1921             :         }
    1922          32 :         new_full_fname = full_path_from_dirfsp_atname(talloc_tos(),
    1923             :                                                 dstfsp,
    1924             :                                                 new_smb_fname);
    1925          32 :         if (new_full_fname == NULL) {
    1926           0 :                 TALLOC_FREE(old_full_fname);
    1927           0 :                 return -1;
    1928             :         }
    1929          32 :         result = SMB_VFS_NEXT_LINKAT(handle,
    1930             :                         srcfsp,
    1931             :                         old_smb_fname,
    1932             :                         dstfsp,
    1933             :                         new_smb_fname,
    1934             :                         flags);
    1935             : 
    1936          32 :         do_log(SMB_VFS_OP_LINKAT,
    1937             :                (result >= 0),
    1938             :                handle,
    1939             :                "%s|%s",
    1940             :                smb_fname_str_do_log(handle->conn, old_full_fname),
    1941             :                smb_fname_str_do_log(handle->conn, new_full_fname));
    1942             : 
    1943          32 :         TALLOC_FREE(old_full_fname);
    1944          32 :         TALLOC_FREE(new_full_fname);
    1945             : 
    1946          32 :         return result;
    1947             : }
    1948             : 
    1949           0 : static int smb_full_audit_mknodat(vfs_handle_struct *handle,
    1950             :                         files_struct *dirfsp,
    1951             :                         const struct smb_filename *smb_fname,
    1952             :                         mode_t mode,
    1953             :                         SMB_DEV_T dev)
    1954             : {
    1955           0 :         struct smb_filename *full_fname = NULL;
    1956           0 :         int result;
    1957             : 
    1958           0 :         full_fname = full_path_from_dirfsp_atname(talloc_tos(),
    1959             :                                                 dirfsp,
    1960             :                                                 smb_fname);
    1961           0 :         if (full_fname == NULL) {
    1962           0 :                 return -1;
    1963             :         }
    1964             : 
    1965           0 :         result = SMB_VFS_NEXT_MKNODAT(handle,
    1966             :                                 dirfsp,
    1967             :                                 smb_fname,
    1968             :                                 mode,
    1969             :                                 dev);
    1970             : 
    1971           0 :         do_log(SMB_VFS_OP_MKNODAT,
    1972             :                (result >= 0),
    1973             :                handle,
    1974             :                "%s",
    1975             :                smb_fname_str_do_log(handle->conn, full_fname));
    1976             : 
    1977           0 :         TALLOC_FREE(full_fname);
    1978             : 
    1979           0 :         return result;
    1980             : }
    1981             : 
    1982     2061214 : static struct smb_filename *smb_full_audit_realpath(vfs_handle_struct *handle,
    1983             :                                 TALLOC_CTX *ctx,
    1984             :                                 const struct smb_filename *smb_fname)
    1985             : {
    1986     2061214 :         struct smb_filename *result_fname = NULL;
    1987             : 
    1988     2061214 :         result_fname = SMB_VFS_NEXT_REALPATH(handle, ctx, smb_fname);
    1989             : 
    1990     2061214 :         do_log(SMB_VFS_OP_REALPATH,
    1991             :                (result_fname != NULL),
    1992             :                handle,
    1993             :                "%s",
    1994             :                smb_fname_str_do_log(handle->conn, smb_fname));
    1995             : 
    1996     2061214 :         return result_fname;
    1997             : }
    1998             : 
    1999           0 : static int smb_full_audit_fchflags(vfs_handle_struct *handle,
    2000             :                         struct files_struct *fsp,
    2001             :                         unsigned int flags)
    2002             : {
    2003           0 :         int result;
    2004             : 
    2005           0 :         result = SMB_VFS_NEXT_FCHFLAGS(handle, fsp, flags);
    2006             : 
    2007           0 :         do_log(SMB_VFS_OP_FCHFLAGS,
    2008             :                (result != 0),
    2009             :                handle,
    2010             :                "%s",
    2011           0 :                smb_fname_str_do_log(handle->conn, fsp->fsp_name));
    2012             : 
    2013           0 :         return result;
    2014             : }
    2015             : 
    2016    17599867 : static struct file_id smb_full_audit_file_id_create(struct vfs_handle_struct *handle,
    2017             :                                                     const SMB_STRUCT_STAT *sbuf)
    2018             : {
    2019    17599867 :         struct file_id id_zero = { 0 };
    2020           0 :         struct file_id result;
    2021           0 :         struct file_id_buf idbuf;
    2022             : 
    2023    17599867 :         result = SMB_VFS_NEXT_FILE_ID_CREATE(handle, sbuf);
    2024             : 
    2025    17599867 :         do_log(SMB_VFS_OP_FILE_ID_CREATE,
    2026    17599867 :                !file_id_equal(&id_zero, &result),
    2027             :                handle,
    2028             :                "%s",
    2029    17599867 :                file_id_str_buf(result, &idbuf));
    2030             : 
    2031    17599867 :         return result;
    2032             : }
    2033             : 
    2034      431710 : static uint64_t smb_full_audit_fs_file_id(struct vfs_handle_struct *handle,
    2035             :                                           const SMB_STRUCT_STAT *sbuf)
    2036             : {
    2037           0 :         uint64_t result;
    2038             : 
    2039      431710 :         result = SMB_VFS_NEXT_FS_FILE_ID(handle, sbuf);
    2040             : 
    2041      431710 :         do_log(SMB_VFS_OP_FS_FILE_ID,
    2042             :                result != 0,
    2043             :                handle, "%" PRIu64, result);
    2044             : 
    2045      431710 :         return result;
    2046             : }
    2047             : 
    2048      176683 : static NTSTATUS smb_full_audit_fstreaminfo(vfs_handle_struct *handle,
    2049             :                                           struct files_struct *fsp,
    2050             :                                           TALLOC_CTX *mem_ctx,
    2051             :                                           unsigned int *pnum_streams,
    2052             :                                           struct stream_struct **pstreams)
    2053             : {
    2054           0 :         NTSTATUS result;
    2055             : 
    2056      176683 :         result = SMB_VFS_NEXT_FSTREAMINFO(handle, fsp, mem_ctx,
    2057             :                                          pnum_streams, pstreams);
    2058             : 
    2059      353366 :         do_log(SMB_VFS_OP_FSTREAMINFO,
    2060      176683 :                NT_STATUS_IS_OK(result),
    2061             :                handle,
    2062             :                "%s",
    2063      176683 :                smb_fname_str_do_log(handle->conn, fsp->fsp_name));
    2064             : 
    2065      176683 :         return result;
    2066             : }
    2067             : 
    2068      138310 : static NTSTATUS smb_full_audit_get_real_filename_at(
    2069             :         struct vfs_handle_struct *handle,
    2070             :         struct files_struct *dirfsp,
    2071             :         const char *name,
    2072             :         TALLOC_CTX *mem_ctx,
    2073             :         char **found_name)
    2074             : {
    2075           0 :         NTSTATUS result;
    2076             : 
    2077      138310 :         result = SMB_VFS_NEXT_GET_REAL_FILENAME_AT(
    2078             :                 handle, dirfsp, name, mem_ctx, found_name);
    2079             : 
    2080      138310 :         do_log(SMB_VFS_OP_GET_REAL_FILENAME_AT,
    2081      138310 :                NT_STATUS_IS_OK(result),
    2082             :                handle,
    2083             :                "%s/%s->%s",
    2084             :                fsp_str_dbg(dirfsp),
    2085             :                name,
    2086      138310 :                NT_STATUS_IS_OK(result) ? *found_name : "");
    2087             : 
    2088      138310 :         return result;
    2089             : }
    2090             : 
    2091     2238932 : static const char *smb_full_audit_connectpath(
    2092             :         vfs_handle_struct *handle,
    2093             :         const struct files_struct *dirfsp,
    2094             :         const struct smb_filename *smb_fname)
    2095             : {
    2096           0 :         const char *result;
    2097             : 
    2098     2238932 :         result = SMB_VFS_NEXT_CONNECTPATH(handle, dirfsp, smb_fname);
    2099             : 
    2100     2238932 :         do_log(SMB_VFS_OP_CONNECTPATH,
    2101             :                result != NULL,
    2102             :                handle,
    2103             :                "%s",
    2104             :                smb_fname_str_do_log(handle->conn, smb_fname));
    2105             : 
    2106     2238932 :         return result;
    2107             : }
    2108             : 
    2109        5627 : static NTSTATUS smb_full_audit_brl_lock_windows(struct vfs_handle_struct *handle,
    2110             :                                                 struct byte_range_lock *br_lck,
    2111             :                                                 struct lock_struct *plock)
    2112             : {
    2113           0 :         NTSTATUS result;
    2114             : 
    2115        5627 :         result = SMB_VFS_NEXT_BRL_LOCK_WINDOWS(handle, br_lck, plock);
    2116             : 
    2117        5627 :         do_log(SMB_VFS_OP_BRL_LOCK_WINDOWS, NT_STATUS_IS_OK(result), handle,
    2118             :             "%s:%llu-%llu. type=%d.",
    2119        5627 :                fsp_str_do_log(brl_fsp(br_lck)),
    2120        5627 :                (unsigned long long)plock->start,
    2121        5627 :                (unsigned long long)plock->size,
    2122        5627 :                plock->lock_type);
    2123             : 
    2124        5627 :         return result;
    2125             : }
    2126             : 
    2127        2775 : static bool smb_full_audit_brl_unlock_windows(struct vfs_handle_struct *handle,
    2128             :                                               struct byte_range_lock *br_lck,
    2129             :                                               const struct lock_struct *plock)
    2130             : {
    2131           0 :         bool result;
    2132             : 
    2133        2775 :         result = SMB_VFS_NEXT_BRL_UNLOCK_WINDOWS(handle, br_lck, plock);
    2134             : 
    2135        2775 :         do_log(SMB_VFS_OP_BRL_UNLOCK_WINDOWS, (result == 0), handle,
    2136        2775 :                "%s:%llu-%llu:%d", fsp_str_do_log(brl_fsp(br_lck)),
    2137        2775 :                (unsigned long long)plock->start,
    2138        2775 :                (unsigned long long)plock->size,
    2139        5550 :                plock->lock_type);
    2140             : 
    2141        2775 :         return result;
    2142             : }
    2143             : 
    2144      126824 : static bool smb_full_audit_strict_lock_check(struct vfs_handle_struct *handle,
    2145             :                                              struct files_struct *fsp,
    2146             :                                              struct lock_struct *plock)
    2147             : {
    2148           0 :         bool result;
    2149             : 
    2150      126824 :         result = SMB_VFS_NEXT_STRICT_LOCK_CHECK(handle, fsp, plock);
    2151             : 
    2152      126824 :         do_log(SMB_VFS_OP_STRICT_LOCK_CHECK, result, handle,
    2153             :                "%s:%llu-%llu:%d", fsp_str_do_log(fsp),
    2154      126824 :                (unsigned long long)plock->start,
    2155      126824 :                (unsigned long long)plock->size,
    2156      126824 :                plock->lock_type);
    2157             : 
    2158      126824 :         return result;
    2159             : }
    2160             : 
    2161    79691056 : static NTSTATUS smb_full_audit_translate_name(struct vfs_handle_struct *handle,
    2162             :                                               const char *name,
    2163             :                                               enum vfs_translate_direction direction,
    2164             :                                               TALLOC_CTX *mem_ctx,
    2165             :                                               char **mapped_name)
    2166             : {
    2167           0 :         NTSTATUS result;
    2168             : 
    2169    79691056 :         result = SMB_VFS_NEXT_TRANSLATE_NAME(handle, name, direction, mem_ctx,
    2170             :                                              mapped_name);
    2171             : 
    2172    79691056 :         do_log(SMB_VFS_OP_TRANSLATE_NAME, NT_STATUS_IS_OK(result), handle, "");
    2173             : 
    2174    79691056 :         return result;
    2175             : }
    2176             : 
    2177     2371613 : static NTSTATUS smb_full_audit_parent_pathname(struct vfs_handle_struct *handle,
    2178             :                                                TALLOC_CTX *mem_ctx,
    2179             :                                                const struct smb_filename *smb_fname_in,
    2180             :                                                struct smb_filename **parent_dir_out,
    2181             :                                                struct smb_filename **atname_out)
    2182             : {
    2183           0 :         NTSTATUS result;
    2184             : 
    2185     2371613 :         result = SMB_VFS_NEXT_PARENT_PATHNAME(handle,
    2186             :                                               mem_ctx,
    2187             :                                               smb_fname_in,
    2188             :                                               parent_dir_out,
    2189             :                                               atname_out);
    2190     2371613 :         do_log(SMB_VFS_OP_CONNECTPATH,
    2191     2371613 :                NT_STATUS_IS_OK(result),
    2192             :                handle,
    2193             :                "%s",
    2194             :                smb_fname_str_do_log(handle->conn, smb_fname_in));
    2195             : 
    2196     2371613 :         return result;
    2197             : }
    2198             : 
    2199         506 : static NTSTATUS smb_full_audit_fsctl(struct vfs_handle_struct *handle,
    2200             :                                 struct files_struct *fsp,
    2201             :                                 TALLOC_CTX *ctx,
    2202             :                                 uint32_t function,
    2203             :                                 uint16_t req_flags,
    2204             :                                 const uint8_t *_in_data,
    2205             :                                 uint32_t in_len,
    2206             :                                 uint8_t **_out_data,
    2207             :                                 uint32_t max_out_len,
    2208             :                                 uint32_t *out_len)
    2209             : {
    2210           0 :         NTSTATUS result;
    2211             : 
    2212         506 :         result = SMB_VFS_NEXT_FSCTL(handle,
    2213             :                                 fsp,
    2214             :                                 ctx,
    2215             :                                 function,
    2216             :                                 req_flags,
    2217             :                                 _in_data,
    2218             :                                 in_len,
    2219             :                                 _out_data,
    2220             :                                 max_out_len,
    2221             :                                 out_len);
    2222             : 
    2223         506 :         do_log(SMB_VFS_OP_FSCTL, NT_STATUS_IS_OK(result), handle, "");
    2224             : 
    2225         506 :         return result;
    2226             : }
    2227             : 
    2228         180 : static struct tevent_req *smb_full_audit_offload_read_send(
    2229             :         TALLOC_CTX *mem_ctx,
    2230             :         struct tevent_context *ev,
    2231             :         struct vfs_handle_struct *handle,
    2232             :         struct files_struct *fsp,
    2233             :         uint32_t fsctl,
    2234             :         uint32_t ttl,
    2235             :         off_t offset,
    2236             :         size_t to_copy)
    2237             : {
    2238         180 :         struct tevent_req *req = NULL;
    2239             : 
    2240         180 :         req = SMB_VFS_NEXT_OFFLOAD_READ_SEND(mem_ctx, ev, handle, fsp,
    2241             :                                              fsctl, ttl, offset, to_copy);
    2242             : 
    2243         180 :         do_log(SMB_VFS_OP_OFFLOAD_READ_SEND, req, handle, "");
    2244             : 
    2245         180 :         return req;
    2246             : }
    2247             : 
    2248         180 : static NTSTATUS smb_full_audit_offload_read_recv(
    2249             :         struct tevent_req *req,
    2250             :         struct vfs_handle_struct *handle,
    2251             :         TALLOC_CTX *mem_ctx,
    2252             :         uint32_t *flags,
    2253             :         uint64_t *xferlen,
    2254             :         DATA_BLOB *_token_blob)
    2255             : {
    2256           0 :         NTSTATUS status;
    2257             : 
    2258         180 :         status = SMB_VFS_NEXT_OFFLOAD_READ_RECV(req, handle, mem_ctx,
    2259             :                                                 flags, xferlen, _token_blob);
    2260             : 
    2261         180 :         do_log(SMB_VFS_OP_OFFLOAD_READ_RECV, NT_STATUS_IS_OK(status), handle, "");
    2262             : 
    2263         180 :         return status;
    2264             : }
    2265             : 
    2266         204 : static struct tevent_req *smb_full_audit_offload_write_send(struct vfs_handle_struct *handle,
    2267             :                                                          TALLOC_CTX *mem_ctx,
    2268             :                                                          struct tevent_context *ev,
    2269             :                                                          uint32_t fsctl,
    2270             :                                                          DATA_BLOB *token,
    2271             :                                                          off_t transfer_offset,
    2272             :                                                          struct files_struct *dest_fsp,
    2273             :                                                          off_t dest_off,
    2274             :                                                             off_t num)
    2275             : {
    2276           0 :         struct tevent_req *req;
    2277             : 
    2278         204 :         req = SMB_VFS_NEXT_OFFLOAD_WRITE_SEND(handle, mem_ctx, ev,
    2279             :                                            fsctl, token, transfer_offset,
    2280             :                                            dest_fsp, dest_off, num);
    2281             : 
    2282         204 :         do_log(SMB_VFS_OP_OFFLOAD_WRITE_SEND, req, handle, "");
    2283             : 
    2284         204 :         return req;
    2285             : }
    2286             : 
    2287         204 : static NTSTATUS smb_full_audit_offload_write_recv(struct vfs_handle_struct *handle,
    2288             :                                                struct tevent_req *req,
    2289             :                                                off_t *copied)
    2290             : {
    2291           0 :         NTSTATUS result;
    2292             : 
    2293         204 :         result = SMB_VFS_NEXT_OFFLOAD_WRITE_RECV(handle, req, copied);
    2294             : 
    2295         204 :         do_log(SMB_VFS_OP_OFFLOAD_WRITE_RECV, NT_STATUS_IS_OK(result), handle, "");
    2296             : 
    2297         204 :         return result;
    2298             : }
    2299             : 
    2300           0 : static NTSTATUS smb_full_audit_fget_compression(vfs_handle_struct *handle,
    2301             :                                                TALLOC_CTX *mem_ctx,
    2302             :                                                struct files_struct *fsp,
    2303             :                                                uint16_t *_compression_fmt)
    2304             : {
    2305           0 :         NTSTATUS result;
    2306             : 
    2307           0 :         result = SMB_VFS_NEXT_FGET_COMPRESSION(handle, mem_ctx, fsp,
    2308             :                                               _compression_fmt);
    2309             : 
    2310           0 :         do_log(SMB_VFS_OP_FGET_COMPRESSION, NT_STATUS_IS_OK(result), handle,
    2311             :                "%s",
    2312             :                fsp_str_do_log(fsp));
    2313             : 
    2314           0 :         return result;
    2315             : }
    2316             : 
    2317           0 : static NTSTATUS smb_full_audit_set_compression(vfs_handle_struct *handle,
    2318             :                                                TALLOC_CTX *mem_ctx,
    2319             :                                                struct files_struct *fsp,
    2320             :                                                uint16_t compression_fmt)
    2321             : {
    2322           0 :         NTSTATUS result;
    2323             : 
    2324           0 :         result = SMB_VFS_NEXT_SET_COMPRESSION(handle, mem_ctx, fsp,
    2325             :                                               compression_fmt);
    2326             : 
    2327           0 :         do_log(SMB_VFS_OP_SET_COMPRESSION, NT_STATUS_IS_OK(result), handle,
    2328             :                "%s", fsp_str_do_log(fsp));
    2329             : 
    2330           0 :         return result;
    2331             : }
    2332             : 
    2333      423149 : static NTSTATUS smb_full_audit_freaddir_attr(struct vfs_handle_struct *handle,
    2334             :                                         struct files_struct *fsp,
    2335             :                                         TALLOC_CTX *mem_ctx,
    2336             :                                         struct readdir_attr_data **pattr_data)
    2337             : {
    2338           0 :         NTSTATUS status;
    2339             : 
    2340      423149 :         status = SMB_VFS_NEXT_FREADDIR_ATTR(handle, fsp, mem_ctx, pattr_data);
    2341             : 
    2342      423149 :         do_log(SMB_VFS_OP_FREADDIR_ATTR,
    2343      423149 :                NT_STATUS_IS_OK(status),
    2344             :                handle,
    2345             :                "%s",
    2346             :                fsp_str_do_log(fsp));
    2347             : 
    2348      423149 :         return status;
    2349             : }
    2350             : 
    2351             : struct smb_full_audit_get_dos_attributes_state {
    2352             :         struct vfs_aio_state aio_state;
    2353             :         vfs_handle_struct *handle;
    2354             :         files_struct *dir_fsp;
    2355             :         const struct smb_filename *smb_fname;
    2356             :         uint32_t dosmode;
    2357             : };
    2358             : 
    2359             : static void smb_full_audit_get_dos_attributes_done(struct tevent_req *subreq);
    2360             : 
    2361           0 : static struct tevent_req *smb_full_audit_get_dos_attributes_send(
    2362             :                 TALLOC_CTX *mem_ctx,
    2363             :                 struct tevent_context *ev,
    2364             :                 struct vfs_handle_struct *handle,
    2365             :                 files_struct *dir_fsp,
    2366             :                 struct smb_filename *smb_fname)
    2367             : {
    2368           0 :         struct tevent_req *req = NULL;
    2369           0 :         struct smb_full_audit_get_dos_attributes_state *state = NULL;
    2370           0 :         struct tevent_req *subreq = NULL;
    2371             : 
    2372           0 :         req = tevent_req_create(mem_ctx, &state,
    2373             :                                 struct smb_full_audit_get_dos_attributes_state);
    2374           0 :         if (req == NULL) {
    2375           0 :                 do_log(SMB_VFS_OP_GET_DOS_ATTRIBUTES_SEND,
    2376             :                        false,
    2377             :                        handle,
    2378             :                        "%s/%s",
    2379             :                        fsp_str_do_log(dir_fsp),
    2380             :                        smb_fname->base_name);
    2381           0 :                 return NULL;
    2382             :         }
    2383           0 :         *state = (struct smb_full_audit_get_dos_attributes_state) {
    2384             :                 .handle = handle,
    2385             :                 .dir_fsp = dir_fsp,
    2386             :                 .smb_fname = smb_fname,
    2387             :         };
    2388             : 
    2389           0 :         subreq = SMB_VFS_NEXT_GET_DOS_ATTRIBUTES_SEND(mem_ctx,
    2390             :                                                       ev,
    2391             :                                                       handle,
    2392             :                                                       dir_fsp,
    2393             :                                                       smb_fname);
    2394           0 :         if (tevent_req_nomem(subreq, req)) {
    2395           0 :                 do_log(SMB_VFS_OP_GET_DOS_ATTRIBUTES_SEND,
    2396             :                        false,
    2397             :                        handle,
    2398             :                        "%s/%s",
    2399             :                        fsp_str_do_log(dir_fsp),
    2400             :                        smb_fname->base_name);
    2401           0 :                 return tevent_req_post(req, ev);
    2402             :         }
    2403           0 :         tevent_req_set_callback(subreq,
    2404             :                                 smb_full_audit_get_dos_attributes_done,
    2405             :                                 req);
    2406             : 
    2407           0 :         do_log(SMB_VFS_OP_GET_DOS_ATTRIBUTES_SEND,
    2408             :                true,
    2409             :                handle,
    2410             :                "%s/%s",
    2411             :                fsp_str_do_log(dir_fsp),
    2412             :                smb_fname->base_name);
    2413             : 
    2414           0 :         return req;
    2415             : }
    2416             : 
    2417           0 : static void smb_full_audit_get_dos_attributes_done(struct tevent_req *subreq)
    2418             : {
    2419           0 :         struct tevent_req *req =
    2420           0 :                 tevent_req_callback_data(subreq,
    2421             :                 struct tevent_req);
    2422           0 :         struct smb_full_audit_get_dos_attributes_state *state =
    2423           0 :                 tevent_req_data(req,
    2424             :                 struct smb_full_audit_get_dos_attributes_state);
    2425           0 :         NTSTATUS status;
    2426             : 
    2427           0 :         status = SMB_VFS_NEXT_GET_DOS_ATTRIBUTES_RECV(subreq,
    2428             :                                                       &state->aio_state,
    2429             :                                                       &state->dosmode);
    2430           0 :         TALLOC_FREE(subreq);
    2431           0 :         if (tevent_req_nterror(req, status)) {
    2432           0 :                 return;
    2433             :         }
    2434             : 
    2435           0 :         tevent_req_done(req);
    2436           0 :         return;
    2437             : }
    2438             : 
    2439           0 : static NTSTATUS smb_full_audit_get_dos_attributes_recv(struct tevent_req *req,
    2440             :                                                 struct vfs_aio_state *aio_state,
    2441             :                                                 uint32_t *dosmode)
    2442             : {
    2443           0 :         struct smb_full_audit_get_dos_attributes_state *state =
    2444           0 :                 tevent_req_data(req,
    2445             :                 struct smb_full_audit_get_dos_attributes_state);
    2446           0 :         NTSTATUS status;
    2447             : 
    2448           0 :         if (tevent_req_is_nterror(req, &status)) {
    2449           0 :                 do_log(SMB_VFS_OP_GET_DOS_ATTRIBUTES_RECV,
    2450             :                        false,
    2451             :                        state->handle,
    2452             :                        "%s/%s",
    2453           0 :                        fsp_str_do_log(state->dir_fsp),
    2454           0 :                        state->smb_fname->base_name);
    2455           0 :                 tevent_req_received(req);
    2456           0 :                 return status;
    2457             :         }
    2458             : 
    2459           0 :         do_log(SMB_VFS_OP_GET_DOS_ATTRIBUTES_RECV,
    2460             :                true,
    2461             :                state->handle,
    2462             :                "%s/%s",
    2463           0 :                fsp_str_do_log(state->dir_fsp),
    2464           0 :                state->smb_fname->base_name);
    2465             : 
    2466           0 :         *aio_state = state->aio_state;
    2467           0 :         *dosmode = state->dosmode;
    2468           0 :         tevent_req_received(req);
    2469           0 :         return NT_STATUS_OK;
    2470             : }
    2471             : 
    2472      709350 : static NTSTATUS smb_full_audit_fget_dos_attributes(
    2473             :                                 struct vfs_handle_struct *handle,
    2474             :                                 struct files_struct *fsp,
    2475             :                                 uint32_t *dosmode)
    2476             : {
    2477           0 :         NTSTATUS status;
    2478             : 
    2479      709350 :         status = SMB_VFS_NEXT_FGET_DOS_ATTRIBUTES(handle,
    2480             :                                 fsp,
    2481             :                                 dosmode);
    2482             : 
    2483      709350 :         do_log(SMB_VFS_OP_FGET_DOS_ATTRIBUTES,
    2484      709350 :                 NT_STATUS_IS_OK(status),
    2485             :                 handle,
    2486             :                 "%s",
    2487             :                 fsp_str_do_log(fsp));
    2488             : 
    2489      709350 :         return status;
    2490             : }
    2491             : 
    2492       86913 : static NTSTATUS smb_full_audit_fset_dos_attributes(
    2493             :                                 struct vfs_handle_struct *handle,
    2494             :                                 struct files_struct *fsp,
    2495             :                                 uint32_t dosmode)
    2496             : {
    2497           0 :         NTSTATUS status;
    2498             : 
    2499       86913 :         status = SMB_VFS_NEXT_FSET_DOS_ATTRIBUTES(handle,
    2500             :                                 fsp,
    2501             :                                 dosmode);
    2502             : 
    2503       86913 :         do_log(SMB_VFS_OP_FSET_DOS_ATTRIBUTES,
    2504       86913 :                 NT_STATUS_IS_OK(status),
    2505             :                 handle,
    2506             :                 "%s",
    2507             :                 fsp_str_do_log(fsp));
    2508             : 
    2509       86913 :         return status;
    2510             : }
    2511             : 
    2512      201351 : static NTSTATUS smb_full_audit_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
    2513             :                                            uint32_t security_info,
    2514             :                                            TALLOC_CTX *mem_ctx,
    2515             :                                            struct security_descriptor **ppdesc)
    2516             : {
    2517           0 :         NTSTATUS result;
    2518             : 
    2519      201351 :         result = SMB_VFS_NEXT_FGET_NT_ACL(handle, fsp, security_info,
    2520             :                                           mem_ctx, ppdesc);
    2521             : 
    2522      201351 :         do_log(SMB_VFS_OP_FGET_NT_ACL, NT_STATUS_IS_OK(result), handle,
    2523             :                "%s", fsp_str_do_log(fsp));
    2524             : 
    2525      201351 :         return result;
    2526             : }
    2527             : 
    2528       88442 : static NTSTATUS smb_full_audit_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
    2529             :                               uint32_t security_info_sent,
    2530             :                               const struct security_descriptor *psd)
    2531             : {
    2532           0 :         struct vfs_full_audit_private_data *pd;
    2533           0 :         NTSTATUS result;
    2534       88442 :         char *sd = NULL;
    2535             : 
    2536       88442 :         SMB_VFS_HANDLE_GET_DATA(handle, pd,
    2537             :                                 struct vfs_full_audit_private_data,
    2538           0 :                                 return NT_STATUS_INTERNAL_ERROR);
    2539             : 
    2540       88442 :         if (pd->log_secdesc) {
    2541           0 :                 sd = sddl_encode(talloc_tos(), psd, get_global_sam_sid());
    2542             :         }
    2543             : 
    2544       88442 :         result = SMB_VFS_NEXT_FSET_NT_ACL(handle, fsp, security_info_sent, psd);
    2545             : 
    2546       88442 :         do_log(SMB_VFS_OP_FSET_NT_ACL, NT_STATUS_IS_OK(result), handle,
    2547             :                "%s [%s]", fsp_str_do_log(fsp), sd ? sd : "");
    2548             : 
    2549       88442 :         TALLOC_FREE(sd);
    2550             : 
    2551       88442 :         return result;
    2552             : }
    2553             : 
    2554           0 : static NTSTATUS smb_full_audit_audit_file(struct vfs_handle_struct *handle,
    2555             :                                 struct smb_filename *file,
    2556             :                                 struct security_acl *sacl,
    2557             :                                 uint32_t access_requested,
    2558             :                                 uint32_t access_denied)
    2559             : {
    2560           0 :         NTSTATUS result;
    2561             : 
    2562           0 :         result = SMB_VFS_NEXT_AUDIT_FILE(handle,
    2563             :                                         file,
    2564             :                                         sacl,
    2565             :                                         access_requested,
    2566             :                                         access_denied);
    2567             : 
    2568           0 :         do_log(SMB_VFS_OP_AUDIT_FILE, NT_STATUS_IS_OK(result), handle,
    2569             :                         "%s",
    2570             :                         smb_fname_str_do_log(handle->conn, file));
    2571             : 
    2572           0 :         return result;
    2573             : }
    2574             : 
    2575           0 : static SMB_ACL_T smb_full_audit_sys_acl_get_fd(vfs_handle_struct *handle,
    2576             :                                                files_struct *fsp,
    2577             :                                                SMB_ACL_TYPE_T type,
    2578             :                                                TALLOC_CTX *mem_ctx)
    2579             : {
    2580           0 :         SMB_ACL_T result;
    2581             : 
    2582           0 :         result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle,
    2583             :                                              fsp,
    2584             :                                              type,
    2585             :                                              mem_ctx);
    2586             : 
    2587           0 :         do_log(SMB_VFS_OP_SYS_ACL_GET_FD, (result != NULL), handle,
    2588             :                "%s", fsp_str_do_log(fsp));
    2589             : 
    2590           0 :         return result;
    2591             : }
    2592             : 
    2593           0 : static int smb_full_audit_sys_acl_blob_get_fd(vfs_handle_struct *handle,
    2594             :                                               files_struct *fsp,
    2595             :                                               TALLOC_CTX *mem_ctx,
    2596             :                                               char **blob_description,
    2597             :                                               DATA_BLOB *blob)
    2598             : {
    2599           0 :         int result;
    2600             : 
    2601           0 :         result = SMB_VFS_NEXT_SYS_ACL_BLOB_GET_FD(handle, fsp, mem_ctx, blob_description, blob);
    2602             : 
    2603           0 :         do_log(SMB_VFS_OP_SYS_ACL_BLOB_GET_FD, (result >= 0), handle,
    2604             :                "%s", fsp_str_do_log(fsp));
    2605             : 
    2606           0 :         return result;
    2607             : }
    2608             : 
    2609           0 : static int smb_full_audit_sys_acl_set_fd(vfs_handle_struct *handle,
    2610             :                                          struct files_struct *fsp,
    2611             :                                          SMB_ACL_TYPE_T type,
    2612             :                                          SMB_ACL_T theacl)
    2613             : {
    2614           0 :         int result;
    2615             : 
    2616           0 :         result = SMB_VFS_NEXT_SYS_ACL_SET_FD(handle, fsp, type, theacl);
    2617             : 
    2618           0 :         do_log(SMB_VFS_OP_SYS_ACL_SET_FD, (result >= 0), handle,
    2619             :                "%s", fsp_str_do_log(fsp));
    2620             : 
    2621           0 :         return result;
    2622             : }
    2623             : 
    2624           0 : static int smb_full_audit_sys_acl_delete_def_fd(vfs_handle_struct *handle,
    2625             :                                 struct files_struct *fsp)
    2626             : {
    2627           0 :         int result;
    2628             : 
    2629           0 :         result = SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FD(handle, fsp);
    2630             : 
    2631           0 :         do_log(SMB_VFS_OP_SYS_ACL_DELETE_DEF_FD,
    2632             :                (result >= 0),
    2633             :                handle,
    2634             :                "%s",
    2635             :                fsp_str_do_log(fsp));
    2636             : 
    2637           0 :         return result;
    2638             : }
    2639             : 
    2640             : struct smb_full_audit_getxattrat_state {
    2641             :         struct vfs_aio_state aio_state;
    2642             :         vfs_handle_struct *handle;
    2643             :         files_struct *dir_fsp;
    2644             :         const struct smb_filename *smb_fname;
    2645             :         const char *xattr_name;
    2646             :         ssize_t xattr_size;
    2647             :         uint8_t *xattr_value;
    2648             : };
    2649             : 
    2650             : static void smb_full_audit_getxattrat_done(struct tevent_req *subreq);
    2651             : 
    2652           0 : static struct tevent_req *smb_full_audit_getxattrat_send(
    2653             :                         TALLOC_CTX *mem_ctx,
    2654             :                         struct tevent_context *ev,
    2655             :                         struct vfs_handle_struct *handle,
    2656             :                         files_struct *dir_fsp,
    2657             :                         const struct smb_filename *smb_fname,
    2658             :                         const char *xattr_name,
    2659             :                         size_t alloc_hint)
    2660             : {
    2661           0 :         struct tevent_req *req = NULL;
    2662           0 :         struct tevent_req *subreq = NULL;
    2663           0 :         struct smb_full_audit_getxattrat_state *state = NULL;
    2664             : 
    2665           0 :         req = tevent_req_create(mem_ctx, &state,
    2666             :                                 struct smb_full_audit_getxattrat_state);
    2667           0 :         if (req == NULL) {
    2668           0 :                 do_log(SMB_VFS_OP_GETXATTRAT_SEND,
    2669             :                        false,
    2670             :                        handle,
    2671             :                        "%s/%s|%s",
    2672             :                        fsp_str_do_log(dir_fsp),
    2673           0 :                        smb_fname->base_name,
    2674             :                        xattr_name);
    2675           0 :                 return NULL;
    2676             :         }
    2677           0 :         *state = (struct smb_full_audit_getxattrat_state) {
    2678             :                 .handle = handle,
    2679             :                 .dir_fsp = dir_fsp,
    2680             :                 .smb_fname = smb_fname,
    2681             :                 .xattr_name = xattr_name,
    2682             :         };
    2683             : 
    2684           0 :         subreq = SMB_VFS_NEXT_GETXATTRAT_SEND(state,
    2685             :                                               ev,
    2686             :                                               handle,
    2687             :                                               dir_fsp,
    2688             :                                               smb_fname,
    2689             :                                               xattr_name,
    2690             :                                               alloc_hint);
    2691           0 :         if (tevent_req_nomem(subreq, req)) {
    2692           0 :                 do_log(SMB_VFS_OP_GETXATTRAT_SEND,
    2693             :                        false,
    2694             :                        handle,
    2695             :                        "%s/%s|%s",
    2696             :                        fsp_str_do_log(dir_fsp),
    2697           0 :                        smb_fname->base_name,
    2698             :                        xattr_name);
    2699           0 :                 return tevent_req_post(req, ev);
    2700             :         }
    2701           0 :         tevent_req_set_callback(subreq, smb_full_audit_getxattrat_done, req);
    2702             : 
    2703           0 :         do_log(SMB_VFS_OP_GETXATTRAT_SEND,
    2704             :                true,
    2705             :                handle,
    2706             :                "%s/%s|%s",
    2707             :                fsp_str_do_log(dir_fsp),
    2708           0 :                smb_fname->base_name,
    2709             :                xattr_name);
    2710             : 
    2711           0 :         return req;
    2712             : }
    2713             : 
    2714           0 : static void smb_full_audit_getxattrat_done(struct tevent_req *subreq)
    2715             : {
    2716           0 :         struct tevent_req *req = tevent_req_callback_data(
    2717             :                 subreq, struct tevent_req);
    2718           0 :         struct smb_full_audit_getxattrat_state *state = tevent_req_data(
    2719             :                 req, struct smb_full_audit_getxattrat_state);
    2720             : 
    2721           0 :         state->xattr_size = SMB_VFS_NEXT_GETXATTRAT_RECV(subreq,
    2722             :                                                          &state->aio_state,
    2723             :                                                          state,
    2724             :                                                          &state->xattr_value);
    2725           0 :         TALLOC_FREE(subreq);
    2726           0 :         if (state->xattr_size == -1) {
    2727           0 :                 tevent_req_error(req, state->aio_state.error);
    2728           0 :                 return;
    2729             :         }
    2730             : 
    2731           0 :         tevent_req_done(req);
    2732             : }
    2733             : 
    2734           0 : static ssize_t smb_full_audit_getxattrat_recv(struct tevent_req *req,
    2735             :                                               struct vfs_aio_state *aio_state,
    2736             :                                               TALLOC_CTX *mem_ctx,
    2737             :                                               uint8_t **xattr_value)
    2738             : {
    2739           0 :         struct smb_full_audit_getxattrat_state *state = tevent_req_data(
    2740             :                 req, struct smb_full_audit_getxattrat_state);
    2741           0 :         ssize_t xattr_size;
    2742             : 
    2743           0 :         if (tevent_req_is_unix_error(req, &aio_state->error)) {
    2744           0 :                 do_log(SMB_VFS_OP_GETXATTRAT_RECV,
    2745             :                        false,
    2746             :                        state->handle,
    2747             :                        "%s/%s|%s",
    2748           0 :                        fsp_str_do_log(state->dir_fsp),
    2749           0 :                        state->smb_fname->base_name,
    2750             :                        state->xattr_name);
    2751           0 :                 tevent_req_received(req);
    2752           0 :                 return -1;
    2753             :         }
    2754             : 
    2755           0 :         do_log(SMB_VFS_OP_GETXATTRAT_RECV,
    2756             :                true,
    2757             :                state->handle,
    2758             :                "%s/%s|%s",
    2759           0 :                fsp_str_do_log(state->dir_fsp),
    2760           0 :                state->smb_fname->base_name,
    2761             :                state->xattr_name);
    2762             : 
    2763           0 :         *aio_state = state->aio_state;
    2764           0 :         xattr_size = state->xattr_size;
    2765           0 :         if (xattr_value != NULL) {
    2766           0 :                 *xattr_value = talloc_move(mem_ctx, &state->xattr_value);
    2767             :         }
    2768             : 
    2769           0 :         tevent_req_received(req);
    2770           0 :         return xattr_size;
    2771             : }
    2772             : 
    2773           2 : static ssize_t smb_full_audit_fgetxattr(struct vfs_handle_struct *handle,
    2774             :                                struct files_struct *fsp,
    2775             :                                const char *name, void *value, size_t size)
    2776             : {
    2777           0 :         ssize_t result;
    2778             : 
    2779           2 :         result = SMB_VFS_NEXT_FGETXATTR(handle, fsp, name, value, size);
    2780             : 
    2781           2 :         do_log(SMB_VFS_OP_FGETXATTR, (result >= 0), handle,
    2782             :                "%s|%s", fsp_str_do_log(fsp), name);
    2783             : 
    2784           2 :         return result;
    2785             : }
    2786             : 
    2787           0 : static ssize_t smb_full_audit_flistxattr(struct vfs_handle_struct *handle,
    2788             :                                 struct files_struct *fsp, char *list,
    2789             :                                 size_t size)
    2790             : {
    2791           0 :         ssize_t result;
    2792             : 
    2793           0 :         result = SMB_VFS_NEXT_FLISTXATTR(handle, fsp, list, size);
    2794             : 
    2795           0 :         do_log(SMB_VFS_OP_FLISTXATTR, (result >= 0), handle,
    2796             :                "%s", fsp_str_do_log(fsp));
    2797             : 
    2798           0 :         return result;
    2799             : }
    2800             : 
    2801           0 : static int smb_full_audit_fremovexattr(struct vfs_handle_struct *handle,
    2802             :                               struct files_struct *fsp,
    2803             :                               const char *name)
    2804             : {
    2805           0 :         int result;
    2806             : 
    2807           0 :         result = SMB_VFS_NEXT_FREMOVEXATTR(handle, fsp, name);
    2808             : 
    2809           0 :         do_log(SMB_VFS_OP_FREMOVEXATTR, (result >= 0), handle,
    2810             :                "%s|%s", fsp_str_do_log(fsp), name);
    2811             : 
    2812           0 :         return result;
    2813             : }
    2814             : 
    2815           0 : static int smb_full_audit_fsetxattr(struct vfs_handle_struct *handle,
    2816             :                            struct files_struct *fsp, const char *name,
    2817             :                            const void *value, size_t size, int flags)
    2818             : {
    2819           0 :         int result;
    2820             : 
    2821           0 :         result = SMB_VFS_NEXT_FSETXATTR(handle, fsp, name, value, size, flags);
    2822             : 
    2823           0 :         do_log(SMB_VFS_OP_FSETXATTR, (result >= 0), handle,
    2824             :                "%s|%s", fsp_str_do_log(fsp), name);
    2825             : 
    2826           0 :         return result;
    2827             : }
    2828             : 
    2829          58 : static bool smb_full_audit_aio_force(struct vfs_handle_struct *handle,
    2830             :                                      struct files_struct *fsp)
    2831             : {
    2832           0 :         bool result;
    2833             : 
    2834          58 :         result = SMB_VFS_NEXT_AIO_FORCE(handle, fsp);
    2835          58 :         do_log(SMB_VFS_OP_AIO_FORCE, result, handle,
    2836             :                 "%s", fsp_str_do_log(fsp));
    2837             : 
    2838          58 :         return result;
    2839             : }
    2840             : 
    2841         384 : static NTSTATUS smb_full_audit_durable_cookie(struct vfs_handle_struct *handle,
    2842             :                                 struct files_struct *fsp,
    2843             :                                 TALLOC_CTX *mem_ctx,
    2844             :                                 DATA_BLOB *cookie)
    2845             : {
    2846           0 :         NTSTATUS result;
    2847             : 
    2848         384 :         result = SMB_VFS_NEXT_DURABLE_COOKIE(handle,
    2849             :                                         fsp,
    2850             :                                         mem_ctx,
    2851             :                                         cookie);
    2852             : 
    2853         384 :         do_log(SMB_VFS_OP_DURABLE_COOKIE, NT_STATUS_IS_OK(result), handle,
    2854             :                         "%s", fsp_str_do_log(fsp));
    2855             : 
    2856         384 :         return result;
    2857             : }
    2858             : 
    2859         112 : static NTSTATUS smb_full_audit_durable_disconnect(
    2860             :                                 struct vfs_handle_struct *handle,
    2861             :                                 struct files_struct *fsp,
    2862             :                                 const DATA_BLOB old_cookie,
    2863             :                                 TALLOC_CTX *mem_ctx,
    2864             :                                 DATA_BLOB *new_cookie)
    2865             : {
    2866           0 :         NTSTATUS result;
    2867             : 
    2868         112 :         result = SMB_VFS_NEXT_DURABLE_DISCONNECT(handle,
    2869             :                                         fsp,
    2870             :                                         old_cookie,
    2871             :                                         mem_ctx,
    2872             :                                         new_cookie);
    2873             : 
    2874         112 :         do_log(SMB_VFS_OP_DURABLE_DISCONNECT, NT_STATUS_IS_OK(result), handle,
    2875             :                         "%s", fsp_str_do_log(fsp));
    2876             : 
    2877         112 :         return result;
    2878             : }
    2879             : 
    2880         110 : static NTSTATUS smb_full_audit_durable_reconnect(
    2881             :                                 struct vfs_handle_struct *handle,
    2882             :                                 struct smb_request *smb1req,
    2883             :                                 struct smbXsrv_open *op,
    2884             :                                 const DATA_BLOB old_cookie,
    2885             :                                 TALLOC_CTX *mem_ctx,
    2886             :                                 struct files_struct **fsp,
    2887             :                                 DATA_BLOB *new_cookie)
    2888             : {
    2889           0 :         NTSTATUS result;
    2890             : 
    2891         110 :         result = SMB_VFS_NEXT_DURABLE_RECONNECT(handle,
    2892             :                                         smb1req,
    2893             :                                         op,
    2894             :                                         old_cookie,
    2895             :                                         mem_ctx,
    2896             :                                         fsp,
    2897             :                                         new_cookie);
    2898             : 
    2899         110 :         do_log(SMB_VFS_OP_DURABLE_RECONNECT,
    2900         110 :                         NT_STATUS_IS_OK(result),
    2901             :                         handle,
    2902             :                         "");
    2903             : 
    2904         110 :         return result;
    2905             : }
    2906             : 
    2907             : static struct vfs_fn_pointers vfs_full_audit_fns = {
    2908             : 
    2909             :         /* Disk operations */
    2910             : 
    2911             :         .connect_fn = smb_full_audit_connect,
    2912             :         .disconnect_fn = smb_full_audit_disconnect,
    2913             :         .disk_free_fn = smb_full_audit_disk_free,
    2914             :         .get_quota_fn = smb_full_audit_get_quota,
    2915             :         .set_quota_fn = smb_full_audit_set_quota,
    2916             :         .get_shadow_copy_data_fn = smb_full_audit_get_shadow_copy_data,
    2917             :         .statvfs_fn = smb_full_audit_statvfs,
    2918             :         .fs_capabilities_fn = smb_full_audit_fs_capabilities,
    2919             :         .get_dfs_referrals_fn = smb_full_audit_get_dfs_referrals,
    2920             :         .create_dfs_pathat_fn = smb_full_audit_create_dfs_pathat,
    2921             :         .read_dfs_pathat_fn = smb_full_audit_read_dfs_pathat,
    2922             :         .fdopendir_fn = smb_full_audit_fdopendir,
    2923             :         .readdir_fn = smb_full_audit_readdir,
    2924             :         .rewind_dir_fn = smb_full_audit_rewinddir,
    2925             :         .mkdirat_fn = smb_full_audit_mkdirat,
    2926             :         .closedir_fn = smb_full_audit_closedir,
    2927             :         .openat_fn = smb_full_audit_openat,
    2928             :         .create_file_fn = smb_full_audit_create_file,
    2929             :         .close_fn = smb_full_audit_close,
    2930             :         .pread_fn = smb_full_audit_pread,
    2931             :         .pread_send_fn = smb_full_audit_pread_send,
    2932             :         .pread_recv_fn = smb_full_audit_pread_recv,
    2933             :         .pwrite_fn = smb_full_audit_pwrite,
    2934             :         .pwrite_send_fn = smb_full_audit_pwrite_send,
    2935             :         .pwrite_recv_fn = smb_full_audit_pwrite_recv,
    2936             :         .lseek_fn = smb_full_audit_lseek,
    2937             :         .sendfile_fn = smb_full_audit_sendfile,
    2938             :         .recvfile_fn = smb_full_audit_recvfile,
    2939             :         .renameat_fn = smb_full_audit_renameat,
    2940             :         .fsync_send_fn = smb_full_audit_fsync_send,
    2941             :         .fsync_recv_fn = smb_full_audit_fsync_recv,
    2942             :         .stat_fn = smb_full_audit_stat,
    2943             :         .fstat_fn = smb_full_audit_fstat,
    2944             :         .lstat_fn = smb_full_audit_lstat,
    2945             :         .fstatat_fn = smb_full_audit_fstatat,
    2946             :         .get_alloc_size_fn = smb_full_audit_get_alloc_size,
    2947             :         .unlinkat_fn = smb_full_audit_unlinkat,
    2948             :         .fchmod_fn = smb_full_audit_fchmod,
    2949             :         .fchown_fn = smb_full_audit_fchown,
    2950             :         .lchown_fn = smb_full_audit_lchown,
    2951             :         .chdir_fn = smb_full_audit_chdir,
    2952             :         .getwd_fn = smb_full_audit_getwd,
    2953             :         .fntimes_fn = smb_full_audit_fntimes,
    2954             :         .ftruncate_fn = smb_full_audit_ftruncate,
    2955             :         .fallocate_fn = smb_full_audit_fallocate,
    2956             :         .lock_fn = smb_full_audit_lock,
    2957             :         .filesystem_sharemode_fn = smb_full_audit_filesystem_sharemode,
    2958             :         .fcntl_fn = smb_full_audit_fcntl,
    2959             :         .linux_setlease_fn = smb_full_audit_linux_setlease,
    2960             :         .getlock_fn = smb_full_audit_getlock,
    2961             :         .symlinkat_fn = smb_full_audit_symlinkat,
    2962             :         .readlinkat_fn = smb_full_audit_readlinkat,
    2963             :         .linkat_fn = smb_full_audit_linkat,
    2964             :         .mknodat_fn = smb_full_audit_mknodat,
    2965             :         .realpath_fn = smb_full_audit_realpath,
    2966             :         .fchflags_fn = smb_full_audit_fchflags,
    2967             :         .file_id_create_fn = smb_full_audit_file_id_create,
    2968             :         .fs_file_id_fn = smb_full_audit_fs_file_id,
    2969             :         .offload_read_send_fn = smb_full_audit_offload_read_send,
    2970             :         .offload_read_recv_fn = smb_full_audit_offload_read_recv,
    2971             :         .offload_write_send_fn = smb_full_audit_offload_write_send,
    2972             :         .offload_write_recv_fn = smb_full_audit_offload_write_recv,
    2973             :         .fget_compression_fn = smb_full_audit_fget_compression,
    2974             :         .set_compression_fn = smb_full_audit_set_compression,
    2975             :         .snap_check_path_fn =  smb_full_audit_snap_check_path,
    2976             :         .snap_create_fn = smb_full_audit_snap_create,
    2977             :         .snap_delete_fn = smb_full_audit_snap_delete,
    2978             :         .fstreaminfo_fn = smb_full_audit_fstreaminfo,
    2979             :         .get_real_filename_at_fn = smb_full_audit_get_real_filename_at,
    2980             :         .connectpath_fn = smb_full_audit_connectpath,
    2981             :         .brl_lock_windows_fn = smb_full_audit_brl_lock_windows,
    2982             :         .brl_unlock_windows_fn = smb_full_audit_brl_unlock_windows,
    2983             :         .strict_lock_check_fn = smb_full_audit_strict_lock_check,
    2984             :         .translate_name_fn = smb_full_audit_translate_name,
    2985             :         .parent_pathname_fn = smb_full_audit_parent_pathname,
    2986             :         .fsctl_fn = smb_full_audit_fsctl,
    2987             :         .get_dos_attributes_send_fn = smb_full_audit_get_dos_attributes_send,
    2988             :         .get_dos_attributes_recv_fn = smb_full_audit_get_dos_attributes_recv,
    2989             :         .fget_dos_attributes_fn = smb_full_audit_fget_dos_attributes,
    2990             :         .fset_dos_attributes_fn = smb_full_audit_fset_dos_attributes,
    2991             :         .fget_nt_acl_fn = smb_full_audit_fget_nt_acl,
    2992             :         .fset_nt_acl_fn = smb_full_audit_fset_nt_acl,
    2993             :         .audit_file_fn = smb_full_audit_audit_file,
    2994             :         .sys_acl_get_fd_fn = smb_full_audit_sys_acl_get_fd,
    2995             :         .sys_acl_blob_get_fd_fn = smb_full_audit_sys_acl_blob_get_fd,
    2996             :         .sys_acl_set_fd_fn = smb_full_audit_sys_acl_set_fd,
    2997             :         .sys_acl_delete_def_fd_fn = smb_full_audit_sys_acl_delete_def_fd,
    2998             :         .getxattrat_send_fn = smb_full_audit_getxattrat_send,
    2999             :         .getxattrat_recv_fn = smb_full_audit_getxattrat_recv,
    3000             :         .fgetxattr_fn = smb_full_audit_fgetxattr,
    3001             :         .flistxattr_fn = smb_full_audit_flistxattr,
    3002             :         .fremovexattr_fn = smb_full_audit_fremovexattr,
    3003             :         .fsetxattr_fn = smb_full_audit_fsetxattr,
    3004             :         .aio_force_fn = smb_full_audit_aio_force,
    3005             :         .durable_cookie_fn = smb_full_audit_durable_cookie,
    3006             :         .durable_disconnect_fn = smb_full_audit_durable_disconnect,
    3007             :         .durable_reconnect_fn = smb_full_audit_durable_reconnect,
    3008             :         .freaddir_attr_fn = smb_full_audit_freaddir_attr,
    3009             : };
    3010             : 
    3011             : static_decl_vfs;
    3012       19291 : NTSTATUS vfs_full_audit_init(TALLOC_CTX *ctx)
    3013             : {
    3014           0 :         NTSTATUS ret;
    3015             : 
    3016       19291 :         smb_vfs_assert_all_fns(&vfs_full_audit_fns, "full_audit");
    3017             : 
    3018       19291 :         ret = smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "full_audit",
    3019             :                                &vfs_full_audit_fns);
    3020             : 
    3021       19291 :         if (!NT_STATUS_IS_OK(ret))
    3022           0 :                 return ret;
    3023             : 
    3024       19291 :         vfs_full_audit_debug_level = debug_add_class("full_audit");
    3025       19291 :         if (vfs_full_audit_debug_level == -1) {
    3026           0 :                 vfs_full_audit_debug_level = DBGC_VFS;
    3027           0 :                 DEBUG(0, ("vfs_full_audit: Couldn't register custom debugging "
    3028             :                           "class!\n"));
    3029             :         } else {
    3030       19291 :                 DEBUG(10, ("vfs_full_audit: Debug class number of "
    3031             :                            "'full_audit': %d\n", vfs_full_audit_debug_level));
    3032             :         }
    3033             : 
    3034       19291 :         return ret;
    3035             : }

Generated by: LCOV version 1.14