mirror of
https://git.freebsd.org/ports.git
synced 2025-06-16 10:10:31 -04:00
This is an initial attempt to add Samba to the FreeBSD after major rewrite of the VFS code in the upstream. Most of the port development is now carried in: https://gitlab.com/samba-freebsd Due to the way how new Samba VFS code is written there is a constrain that Samba 4.14+ can run only on FreeBSD 13.1+, as it requires support of the `nodup` option for the `fdesc` file system, as well as it's presence in the system in general. https://gitlab.com/samba-freebsd/-/wikis/The-New-VFS I'd like to thank CyberSecure Pty Ltd. company for their supoort of the port development and Andrew Walker from iXsystems Inc. for the patches he created and made available for the Samba4 on TrueNAS. PR: 263874
105 lines
2.8 KiB
Diff
105 lines
2.8 KiB
Diff
From 4d27a5990311fdd4c73918781f91a3c18196b24c Mon Sep 17 00:00:00 2001
|
|
From: Andrew Walker <awalker@ixsystems.com>
|
|
Date: Fri, 12 Nov 2021 14:48:25 -0500
|
|
Subject: [PATCH] s3:modules:zfsacl - fix get/set ACL on FreeBSD 13+
|
|
|
|
FreeBSD 13 added support for O_PATH, which means
|
|
that fsp being used in get_nt_acl() and set_nt_acl()
|
|
will have O_PATH opens and we must use either the IO
|
|
fd or use a procfd path for this.
|
|
|
|
Signed-off-by: Andrew Walker <awalker@ixsystems.com>
|
|
---
|
|
source3/modules/vfs_zfsacl.c | 62 ++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 62 insertions(+)
|
|
|
|
diff --git a/source3/modules/vfs_zfsacl.c b/source3/modules/vfs_zfsacl.c
|
|
index 69a1db59249..0472de23825 100644
|
|
--- 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 "
|
|
@@ -321,7 +352,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.37.1
|
|
|