summaryrefslogtreecommitdiff
path: root/net/samba419/files/0099-s3-modules-zfsacl-fix-get-set-ACL-on-FreeBSD-13.patch
diff options
context:
space:
mode:
Diffstat (limited to 'net/samba419/files/0099-s3-modules-zfsacl-fix-get-set-ACL-on-FreeBSD-13.patch')
-rw-r--r--net/samba419/files/0099-s3-modules-zfsacl-fix-get-set-ACL-on-FreeBSD-13.patch164
1 files changed, 164 insertions, 0 deletions
diff --git a/net/samba419/files/0099-s3-modules-zfsacl-fix-get-set-ACL-on-FreeBSD-13.patch b/net/samba419/files/0099-s3-modules-zfsacl-fix-get-set-ACL-on-FreeBSD-13.patch
new file mode 100644
index 000000000000..275e7e464456
--- /dev/null
+++ b/net/samba419/files/0099-s3-modules-zfsacl-fix-get-set-ACL-on-FreeBSD-13.patch
@@ -0,0 +1,164 @@
+From ff8b27f6f0c67cbb0fb37f80f3336c1bd0f28430 Mon Sep 17 00:00:00 2001
+From: Andrew Walker <awalker@ixsystems.com>
+Date: Thu, 16 Mar 2023 09:05:45 -0700
+Subject: [PATCH] Fixups for VFS changes in 4.18
+
+---
+ debian/changelog | 24 ++++++------------
+ lib/audit_logging/audit_logging.c | 4 +--
+ source3/modules/vfs_shadow_copy_zfs.c | 24 ++++++++----------
+ source3/modules/vfs_tmprotect.c | 2 +-
+ source3/modules/vfs_zfsacl.c | 35 +++++++++++++++++++++++++++
+ source3/utils/net_groupmap.c | 6 ++---
+ 6 files changed, 58 insertions(+), 37 deletions(-)
+
+diff --git a/source3/modules/vfs_zfsacl.c b/source3/modules/vfs_zfsacl.c
+index e24cb683d2..18f8dcb4b2 100644
+--- a/source3/modules/vfs_zfsacl.c
++++ b/source3/modules/vfs_zfsacl.c
+@@ -307,6 +307,41 @@ static NTSTATUS zfs_set_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
+ zfs_process_smbacl);
+ }
+
++static int get_zfsacl(TALLOC_CTX *mem_ctx,
++ const struct smb_filename *smb_fname,
++ ace_t **outbuf)
++{
++ int naces, rv;
++ ace_t *acebuf = NULL;
++
++ naces = acl(smb_fname->base_name, ACE_GETACLCNT, 0, NULL);
++ if (naces == -1) {
++ int dbg_level = 10;
++
++ if (errno == ENOSYS) {
++ dbg_level = 1;
++ }
++ DEBUG(dbg_level, ("acl(ACE_GETACLCNT, %s): %s ",
++ smb_fname->base_name, strerror(errno)));
++ return naces;
++ }
++ acebuf = talloc_size(mem_ctx, sizeof(ace_t)*naces);
++ if (acebuf == NULL) {
++ errno = ENOMEM;
++ return -1;
++ }
++
++ rv = acl(smb_fname->base_name, ACE_GETACL, naces, acebuf);
++ if (rv == -1) {
++ DBG_DEBUG("acl(ACE_GETACL, %s) failed: %s ",
++ smb_fname->base_name, strerror(errno));
++ return -1;
++ }
++
++ *outbuf = acebuf;
++ return naces;
++}
++
+ static int fget_zfsacl(TALLOC_CTX *mem_ctx,
+ struct files_struct *fsp,
+ ace_t **outbuf)
+From 0c2c9f21cf01983d9001edef4983bc15b79a31ad Mon Sep 17 00:00:00 2001
+From: Andrew <awalker@ixsystems.com>
+Date: Mon, 29 Nov 2021 12:33:15 -0500
+Subject: [PATCH] NAS-113538 / Fix procfd handling for xattr-based alternate
+ datastreams (#54)
+
+vfs_streams_xattr openat() does not set fsp.flags.have_proc_fds. In open_streams_for_delete() the fsp is not allocated via talloc_zero() and so this may be unitialized memory.
+
+This particular fix ensures vfs_streams_xattr sets the fsp have_proc_fds flag to the one defined in the associated tree connect for the fsp. In the case of vfs_ixnas, ensure that we read the NT ACL from fsp->base_fsp (file) rather than the fsp associated with the xattr.
+
+This PR also fixes vfs_zfsacl for FreeBSD 13 (adding handling for procfd paths)
+---
+ source3/modules/vfs_ixnas.c | 4 ++-
+ source3/modules/vfs_zfsacl.c | 62 ++++++++++++++++++++++++++++++++++++
+ 2 files changed, 65 insertions(+), 1 deletion(-)
+
+--- a/source3/modules/vfs_zfsacl.c
++++ b/source3/modules/vfs_zfsacl.c
+@@ -235,12 +235,43 @@ static bool zfs_process_smbacl(vfs_handle_struct *handle, files_struct *fsp,
+ SMB_ASSERT(i == naces);
+
+ /* store acl */
++#ifdef O_PATH
++ if (fsp->fsp_flags.is_pathref) {
++ const char *proc_fd_path = NULL;
++ char buf[PATH_MAX];
++
++ if (!fsp->fsp_flags.have_proc_fds) {
++ DBG_ERR("fdescfs filesystem must be mounted with 'nodup' "
++ "option \n");
++ errno = EBADF;
++ return -1;
++ }
++
++ fd = fsp_get_pathref_fd(fsp);
++ proc_fd_path = sys_proc_fd_path(fd, buf, sizeof(buf));
++ if (proc_fd_path == NULL) {
++ DBG_ERR("%s: failed to generate pathref fd for %d\n",
++ fsp_str_dbg(fsp), fd);
++ errno = EBADF;
++ return -1;
++ }
++ rv = acl(proc_fd_path, ACE_SETACL, naces, acebuf);
++ } else {
++ fd = fsp_get_io_fd(fsp);
++ if (fd == -1) {
++ errno = EBADF;
++ return false;
++ }
++ rv = facl(fd, ACE_SETACL, naces, acebuf);
++ }
++#else
+ fd = fsp_get_pathref_fd(fsp);
+ if (fd == -1) {
+ errno = EBADF;
+ return false;
+ }
+ rv = facl(fd, ACE_SETACL, naces, acebuf);
++#endif
+ if (rv != 0) {
+ if(errno == ENOSYS) {
+ DEBUG(9, ("acl(ACE_SETACL, %s): Operation is not "
+@@ -286,7 +317,38 @@ static int fget_zfsacl(TALLOC_CTX *mem_ctx,
+ ace_t *acebuf = NULL;
+ int fd;
+
++#ifdef O_PATH
++ if (fsp->fsp_flags.is_pathref) {
++ const char *proc_fd_path = NULL;
++ char buf[PATH_MAX];
++ struct smb_filename smb_fname;
++
++ if (!fsp->fsp_flags.have_proc_fds) {
++ DBG_ERR("fdescfs filesystem must be mounted with 'nodup' "
++ "option \n");
++ errno = EBADF;
++ return -1;
++ }
++
++ fd = fsp_get_pathref_fd(fsp);
++ proc_fd_path = sys_proc_fd_path(fd, buf, sizeof(buf));
++ if (proc_fd_path == NULL) {
++ DBG_ERR("%s: failed to generate pathref fd for %d\n",
++ fsp_str_dbg(fsp), fd);
++ errno = EBADF;
++ return -1;
++ }
++
++ smb_fname = (struct smb_filename) {
++ .base_name = discard_const_p(char, proc_fd_path)
++ };
++
++ return get_zfsacl(mem_ctx, &smb_fname, outbuf);
++ }
++ fd = fsp_get_io_fd(fsp);
++#else
+ fd = fsp_get_pathref_fd(fsp);
++#endif
+ if (fd == -1) {
+ errno = EBADF;
+ return -1;
+--
+2.43.0
+