[SCM] Samba Shared Repository - branch master updated
Jeremy Allison
jra at samba.org
Wed Apr 29 18:17:02 UTC 2020
The branch, master has been updated
via 954d877a2ee smbd: remove unneeded parent_dir variable from mkdir_internal()
via 328716b91b1 smbd: convert inherit_from_dir arg of change_dir_owner_to_parent() to struct smb_filename
via 3eb42c24ff7 smbd: convert inherit_from_dir arg of change_file_owner_to_parent() to struct smb_filename
via bf504ac3c64 smbd: convert inherit_access_posix_acl() arg parent_dir to struct smb_filename
via 0ff2dda37d3 smbd: convert parent_dir arg of open_file() to struct smb_filename
via 4cc86556a83 smbd: pass dirname as struct smb_filename to is_visible_file()
via 84743b727f4 smbd: realign is_visible_file() args one per line
via 37a9736810d smbd: copy twrp in cp_smb_filename()
via 9f64f30140c smbd: add previous version timestamp to struct smb_filename
via 45a560bce3e smbd: pass struct smb_filename smb_fname_parent to unix_mode()
via 214dea7defe smbd: pass struct smb_filename parent_dir to file_set_dosmode()
via 224b1405839 smbd: align file_set_dosmode() args one per line
via d9ae1c78b92 smbd: pass struct smb_filename to directory_has_default_acl()
via aa0ec8a2098 smbd: use parent_smb_fname() in check_reduced_name()
via 8fdfbc8d5c9 smbd: use parent_smb_fname() in check_reduced_name_with_privilege()
via adf75b8cef7 smbd: use parent_smb_fname() in smb_unix_mknod()
via 75b85a4d846 smbd: use parent_smb_fname() in parent_dirname_compatible_open()
via 3830ba0d5bc smbd: use parent_smb_fname() in inherit_new_acl()
via 90a198bcd0a smbd: use parent_smb_fname() in mkdir_internal()
via 16f866a1a0d smbd: use parent_smb_fname() in open_file_ntcreate()
via 4c497c77315 smbd: use parent_smb_fname() in non_widelink_open()
via 61bf5410f0e smbd: use parent_smb_fname() in check_parent_access()
via 58a995931d7 smbd: use parent_smb_fname() in copy_internals()
via c0a9c8698c2 smbd: use parent_smb_fname() in unix_convert()
via 3cc0dcad35c smbd: use synthetic_smb_fname() in check_parent_exists()
via 4d1ba69abad smbd: use parent_smb_fname() in can_delete_file_in_directory()
via aa125a7d368 vfs_linux_xfs_sgid: use parent_smb_fname()
via 259857038b6 vfs_gpfs: use parent_smb_fname()
via 036ed35b3bb vfs_default: use parent_smb_fname()
via 8bd6908baef vfs_ceph: use parent_smb_fname()
via 7f68944acdf vfs_aio_pthread: use parent_smb_fname()
via eafd4160b0d vfs_acl_common: use parent_smb_fname()
via 5fe180e7510 s3/lib: add parent_smb_fname()
from a454c9cd42e testprogs: Add client kerberos test
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 954d877a2eefd985479f35a99c2dd8c804f15cc0
Author: Ralph Boehme <slow at samba.org>
Date: Wed Apr 29 11:06:26 2020 +0200
smbd: remove unneeded parent_dir variable from mkdir_internal()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
Autobuild-User(master): Jeremy Allison <jra at samba.org>
Autobuild-Date(master): Wed Apr 29 18:16:02 UTC 2020 on sn-devel-184
commit 328716b91b1365ed0ec0a5e6f16114a453cbd88e
Author: Ralph Boehme <slow at samba.org>
Date: Wed Apr 29 11:05:25 2020 +0200
smbd: convert inherit_from_dir arg of change_dir_owner_to_parent() to struct smb_filename
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 3eb42c24ff767efd6d8335aecdd51be4549c84d3
Author: Ralph Boehme <slow at samba.org>
Date: Wed Apr 29 11:03:11 2020 +0200
smbd: convert inherit_from_dir arg of change_file_owner_to_parent() to struct smb_filename
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit bf504ac3c6421757c1aa2822b3ffa5212e1e87f7
Author: Ralph Boehme <slow at samba.org>
Date: Wed Apr 29 10:56:23 2020 +0200
smbd: convert inherit_access_posix_acl() arg parent_dir to struct smb_filename
This also fixes a bug introduced by cea8e57eac2ed7b90a5c5d207bf392ff0546398e
where inherit_access_posix_acl() used the smb_fname->base_name instead of
inherit_from_dir in synthetic_smb_fname() to get an struct smb_filename of the
parent directory.
Nobody complained so far, fix it silently.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 0ff2dda37d34338f2b931839815a21269ab1626a
Author: Ralph Boehme <slow at samba.org>
Date: Wed Apr 29 10:43:05 2020 +0200
smbd: convert parent_dir arg of open_file() to struct smb_filename
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 4cc86556a8323d4bd08bf0c93b971919e96a2a19
Author: Ralph Boehme <slow at samba.org>
Date: Wed Apr 29 10:09:16 2020 +0200
smbd: pass dirname as struct smb_filename to is_visible_file()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 84743b727f4f5bb367876d7651098ebec66fcdd9
Author: Ralph Boehme <slow at samba.org>
Date: Wed Apr 29 09:51:13 2020 +0200
smbd: realign is_visible_file() args one per line
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 37a9736810d236420f13f158a10b13cf5f67a532
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 18:24:59 2020 +0200
smbd: copy twrp in cp_smb_filename()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 9f64f30140c4ad2a4d34294f35f5082f96fc5460
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 18:23:37 2020 +0200
smbd: add previous version timestamp to struct smb_filename
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 45a560bce3ef06c211e60e3932521303cc396896
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 18:18:08 2020 +0200
smbd: pass struct smb_filename smb_fname_parent to unix_mode()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 214dea7defeb3d87cfaaf02a0b1171b8ca28ba91
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 18:09:18 2020 +0200
smbd: pass struct smb_filename parent_dir to file_set_dosmode()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 224b140583937f450bbc8946206f11bc6b87eccc
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 18:06:21 2020 +0200
smbd: align file_set_dosmode() args one per line
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit d9ae1c78b92c876dbe285d6edd170e920933c0a5
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 18:03:41 2020 +0200
smbd: pass struct smb_filename to directory_has_default_acl()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit aa0ec8a20983ad2ec96eb0d874633baafb228807
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 17:58:07 2020 +0200
smbd: use parent_smb_fname() in check_reduced_name()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 8fdfbc8d5c9926ecaf69012ce94fd323284ce60a
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 17:50:01 2020 +0200
smbd: use parent_smb_fname() in check_reduced_name_with_privilege()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit adf75b8cef7887913965b7ced2618723fbe74992
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 17:08:53 2020 +0200
smbd: use parent_smb_fname() in smb_unix_mknod()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 75b85a4d846e89ddc517906311a1da07645b2ffd
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 16:55:30 2020 +0200
smbd: use parent_smb_fname() in parent_dirname_compatible_open()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 3830ba0d5bc34c64e79e492315e41dde10a86e33
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 16:52:09 2020 +0200
smbd: use parent_smb_fname() in inherit_new_acl()
Note: has to rename the variable parent_smb_fname otherwise it conflicts with
the function name.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 90a198bcd0a7c2b76f474de1f95f5dc39882c3ec
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 16:47:44 2020 +0200
smbd: use parent_smb_fname() in mkdir_internal()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 16f866a1a0d5bdd791592bf591c64dd59918fe42
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 16:44:00 2020 +0200
smbd: use parent_smb_fname() in open_file_ntcreate()
Prepares for converting a bunch of functions to struct smb_filename later.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 4c497c773156111e8fd12ab8573cf78d62823218
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 16:40:25 2020 +0200
smbd: use parent_smb_fname() in non_widelink_open()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 61bf5410f0eeb274a67f426811c2dae921626452
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 16:23:07 2020 +0200
smbd: use parent_smb_fname() in check_parent_access()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 58a995931d742bf76d7fd38b5ab87444c29972a5
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 16:11:38 2020 +0200
smbd: use parent_smb_fname() in copy_internals()
Prepares for converting file_set_dosmode() to struct smb_filename.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit c0a9c8698c21b72e3409af9263e2afa16443f805
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 16:00:42 2020 +0200
smbd: use parent_smb_fname() in unix_convert()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 3cc0dcad35c0a3fea5e44045d3a241f0d0bffc32
Author: Ralph Boehme <slow at samba.org>
Date: Wed Apr 29 15:43:30 2020 +0200
smbd: use synthetic_smb_fname() in check_parent_exists()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 4d1ba69abad08262c71461a6b660c7589d40d596
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 15:21:37 2020 +0200
smbd: use parent_smb_fname() in can_delete_file_in_directory()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit aa125a7d3689c7707e21a52b67ce4ec33cc0454c
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 15:01:59 2020 +0200
vfs_linux_xfs_sgid: use parent_smb_fname()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 259857038b6c95d233cc71dfbf295d454dc8a619
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 14:47:40 2020 +0200
vfs_gpfs: use parent_smb_fname()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 036ed35b3bba237f68fec2f1c16173bec729474e
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 14:43:20 2020 +0200
vfs_default: use parent_smb_fname()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 8bd6908baef37015c2123d75f014509069ae6eb9
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 14:41:21 2020 +0200
vfs_ceph: use parent_smb_fname()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 7f68944acdfe5cee44f2329f5a581cad7ee430f6
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 14:28:32 2020 +0200
vfs_aio_pthread: use parent_smb_fname()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit eafd4160b0deef36dd86c692b8980970790b50e2
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 14:15:38 2020 +0200
vfs_acl_common: use parent_smb_fname()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 5fe180e751093bb10f847137f879a961db245689
Author: Ralph Boehme <slow at samba.org>
Date: Tue Apr 28 12:55:26 2020 +0200
s3/lib: add parent_smb_fname()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
-----------------------------------------------------------------------
Summary of changes:
source3/include/proto.h | 4 +
source3/include/vfs.h | 1 +
source3/lib/filename_util.c | 64 +++++++++++++
source3/modules/vfs_acl_common.c | 36 +++----
source3/modules/vfs_aio_pthread.c | 46 +++++----
source3/modules/vfs_ceph.c | 18 ++--
source3/modules/vfs_default.c | 15 +--
source3/modules/vfs_gpfs.c | 21 +++--
source3/modules/vfs_linux_xfs_sgid.c | 57 ++++++-----
source3/smbd/close.c | 6 +-
source3/smbd/dir.c | 19 ++--
source3/smbd/dosmode.c | 35 +++----
source3/smbd/file_access.c | 31 ++----
source3/smbd/filename.c | 50 ++++++----
source3/smbd/nttrans.c | 11 ++-
source3/smbd/open.c | 178 ++++++++++++++---------------------
source3/smbd/posix_acls.c | 16 +---
source3/smbd/proto.h | 22 +++--
source3/smbd/reply.c | 23 ++---
source3/smbd/trans2.c | 17 +++-
source3/smbd/vfs.c | 94 +++++++++---------
21 files changed, 401 insertions(+), 363 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 6ac0c3d1935..0fd6e64fee3 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -392,6 +392,10 @@ char *myhostname_upper(void);
#include "lib/util_path.h"
bool parent_dirname(TALLOC_CTX *mem_ctx, const char *dir, char **parent,
const char **name);
+bool parent_smb_fname(TALLOC_CTX *mem_ctx,
+ const struct smb_filename *path,
+ struct smb_filename **_parent,
+ struct smb_filename **_name);
bool ms_has_wild(const char *s);
bool ms_has_wild_w(const smb_ucs2_t *s);
bool mask_match(const char *string, const char *pattern, bool is_case_sensitive);
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index d0151213b0e..ce969747546 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -655,6 +655,7 @@ struct smb_filename {
char *stream_name;
uint32_t flags;
SMB_STRUCT_STAT st;
+ NTTIME twrp;
};
/*
diff --git a/source3/lib/filename_util.c b/source3/lib/filename_util.c
index 1f2e4d31072..37dc6554018 100644
--- a/source3/lib/filename_util.c
+++ b/source3/lib/filename_util.c
@@ -225,9 +225,73 @@ struct smb_filename *cp_smb_filename(TALLOC_CTX *mem_ctx,
}
out->flags = in->flags;
out->st = in->st;
+ out->twrp = in->twrp;
return out;
}
+/**
+ * Return allocated parent directory and basename of path
+ *
+ * Note: if requesting name, it is returned as talloc child of the
+ * parent. Freeing the parent is thus sufficient to free both.
+ */
+bool parent_smb_fname(TALLOC_CTX *mem_ctx,
+ const struct smb_filename *path,
+ struct smb_filename **_parent,
+ struct smb_filename **_name)
+{
+ TALLOC_CTX *frame = talloc_stackframe();
+ struct smb_filename *parent = NULL;
+ struct smb_filename *name = NULL;
+ char *p = NULL;
+
+ parent = cp_smb_filename(frame, path);
+ if (parent == NULL) {
+ TALLOC_FREE(frame);
+ return false;
+ }
+ TALLOC_FREE(parent->stream_name);
+ SET_STAT_INVALID(parent->st);
+
+ p = strrchr_m(parent->base_name, '/'); /* Find final '/', if any */
+ if (p == NULL) {
+ TALLOC_FREE(parent->base_name);
+ parent->base_name = talloc_strdup(parent, ".");
+ if (parent->base_name == NULL) {
+ TALLOC_FREE(frame);
+ return false;
+ }
+ p = path->base_name;
+ } else {
+ *p = '\0';
+ p++;
+ }
+
+ if (_name == NULL) {
+ *_parent = talloc_move(mem_ctx, &parent);
+ TALLOC_FREE(frame);
+ return true;
+ }
+
+ name = cp_smb_filename(frame, path);
+ if (name == NULL) {
+ TALLOC_FREE(frame);
+ return false;
+ }
+ TALLOC_FREE(name->base_name);
+
+ name->base_name = talloc_strdup(mem_ctx, p);
+ if (name == NULL) {
+ TALLOC_FREE(frame);
+ return false;
+ }
+
+ *_parent = talloc_move(mem_ctx, &parent);
+ *_name = talloc_move(*_parent, &name);
+ TALLOC_FREE(frame);
+ return true;
+}
+
static void assert_valid_stream_smb_fname(const struct smb_filename *smb_fname)
{
/* stream_name must always be NULL if there is no stream. */
diff --git a/source3/modules/vfs_acl_common.c b/source3/modules/vfs_acl_common.c
index 7bed255d390..43167be77a3 100644
--- a/source3/modules/vfs_acl_common.c
+++ b/source3/modules/vfs_acl_common.c
@@ -1092,12 +1092,11 @@ static int acl_common_remove_object(vfs_handle_struct *handle,
struct file_id id;
files_struct *fsp = NULL;
int ret = 0;
- char *parent_dir = NULL;
- const char *final_component = NULL;
- struct smb_filename local_fname = {0};
- struct smb_filename parent_dir_fname = {0};
+ struct smb_filename *local_fname = NULL;
+ struct smb_filename *parent_dir_fname = NULL;
int saved_errno = 0;
struct smb_filename *saved_dir_fname = NULL;
+ bool ok;
saved_dir_fname = vfs_GetWd(talloc_tos(),conn);
if (saved_dir_fname == NULL) {
@@ -1105,35 +1104,35 @@ static int acl_common_remove_object(vfs_handle_struct *handle,
goto out;
}
- if (!parent_dirname(talloc_tos(), smb_fname->base_name,
- &parent_dir, &final_component)) {
+ ok = parent_smb_fname(talloc_tos(),
+ smb_fname,
+ &parent_dir_fname,
+ &local_fname);
+ if (!ok) {
saved_errno = ENOMEM;
goto out;
}
DBG_DEBUG("removing %s %s/%s\n", is_directory ? "directory" : "file",
- parent_dir, final_component);
-
- parent_dir_fname = (struct smb_filename) { .base_name = parent_dir };
+ smb_fname_str_dbg(parent_dir_fname),
+ smb_fname_str_dbg(local_fname));
/* cd into the parent dir to pin it. */
- ret = vfs_ChDir(conn, &parent_dir_fname);
+ ret = vfs_ChDir(conn, parent_dir_fname);
if (ret == -1) {
saved_errno = errno;
goto out;
}
- local_fname.base_name = discard_const_p(char, final_component);
-
/* Must use lstat here. */
- ret = SMB_VFS_LSTAT(conn, &local_fname);
+ ret = SMB_VFS_LSTAT(conn, local_fname);
if (ret == -1) {
saved_errno = errno;
goto out;
}
/* Ensure we have this file open with DELETE access. */
- id = vfs_file_id_from_sbuf(conn, &local_fname.st);
+ id = vfs_file_id_from_sbuf(conn, &local_fname->st);
for (fsp = file_find_di_first(conn->sconn, id); fsp;
fsp = file_find_di_next(fsp)) {
if (fsp->access_mask & DELETE_ACCESS &&
@@ -1149,7 +1148,8 @@ static int acl_common_remove_object(vfs_handle_struct *handle,
if (!fsp) {
DBG_DEBUG("%s %s/%s not an open file\n",
is_directory ? "directory" : "file",
- parent_dir, final_component);
+ smb_fname_str_dbg(parent_dir_fname),
+ smb_fname_str_dbg(local_fname));
saved_errno = EACCES;
goto out;
}
@@ -1158,12 +1158,12 @@ static int acl_common_remove_object(vfs_handle_struct *handle,
if (is_directory) {
ret = SMB_VFS_NEXT_UNLINKAT(handle,
conn->cwd_fsp,
- &local_fname,
+ local_fname,
AT_REMOVEDIR);
} else {
ret = SMB_VFS_NEXT_UNLINKAT(handle,
conn->cwd_fsp,
- &local_fname,
+ local_fname,
0);
}
unbecome_root();
@@ -1174,7 +1174,7 @@ static int acl_common_remove_object(vfs_handle_struct *handle,
out:
- TALLOC_FREE(parent_dir);
+ TALLOC_FREE(parent_dir_fname);
if (saved_dir_fname) {
vfs_ChDir(conn, saved_dir_fname);
diff --git a/source3/modules/vfs_aio_pthread.c b/source3/modules/vfs_aio_pthread.c
index 1ccf89a6d8c..45b59bcb813 100644
--- a/source3/modules/vfs_aio_pthread.c
+++ b/source3/modules/vfs_aio_pthread.c
@@ -48,8 +48,8 @@ struct aio_open_private_data {
mode_t mode;
uint64_t mid;
bool in_progress;
- const char *fname;
- char *dname;
+ struct smb_filename *dname;
+ struct smb_filename *fname;
connection_struct *conn;
struct smbXsrv_connection *xconn;
const struct security_unix_token *ux_tok;
@@ -111,8 +111,8 @@ static void aio_open_handle_completion(struct tevent_req *subreq)
* don't leak memory.
*/
DBG_NOTICE("aio open request for %s/%s abandoned in flight\n",
- opd->dname,
- opd->fname);
+ opd->dname->base_name,
+ opd->fname->base_name);
if (opd->ret_fd != -1) {
close(opd->ret_fd);
opd->ret_fd = -1;
@@ -154,8 +154,8 @@ static void aio_open_handle_completion(struct tevent_req *subreq)
DEBUG(10,("aio_open_handle_completion: mid %llu "
"for file %s/%s completed\n",
(unsigned long long)opd->mid,
- opd->dname,
- opd->fname));
+ opd->dname->base_name,
+ opd->fname->base_name));
opd->in_progress = false;
@@ -202,7 +202,7 @@ static void aio_open_worker(void *private_data)
static void aio_open_do(struct aio_open_private_data *opd)
{
opd->ret_fd = openat(opd->dir_fd,
- opd->fname,
+ opd->fname->base_name,
opd->flags,
opd->mode);
@@ -255,7 +255,7 @@ static struct aio_open_private_data *create_private_open_data(TALLOC_CTX *ctx,
{
struct aio_open_private_data *opd = talloc_zero(ctx,
struct aio_open_private_data);
- const char *fname = NULL;
+ bool ok;
if (!opd) {
return NULL;
@@ -290,23 +290,19 @@ static struct aio_open_private_data *create_private_open_data(TALLOC_CTX *ctx,
* Copy the parent directory name and the
* relative path within it.
*/
- if (parent_dirname(opd,
- fsp->fsp_name->base_name,
- &opd->dname,
- &fname) == false) {
- opd_free(opd);
- return NULL;
- }
- opd->fname = talloc_strdup(opd, fname);
- if (opd->fname == NULL) {
+ ok = parent_smb_fname(opd,
+ fsp->fsp_name,
+ &opd->dname,
+ &opd->fname);
+ if (!ok) {
opd_free(opd);
return NULL;
}
#if defined(O_DIRECTORY)
- opd->dir_fd = open(opd->dname, O_RDONLY|O_DIRECTORY);
+ opd->dir_fd = open(opd->dname->base_name, O_RDONLY|O_DIRECTORY);
#else
- opd->dir_fd = open(opd->dname, O_RDONLY);
+ opd->dir_fd = open(opd->dname->base_name, O_RDONLY);
#endif
if (opd->dir_fd == -1) {
opd_free(opd);
@@ -326,8 +322,8 @@ static int opd_inflight_destructor(struct aio_open_private_data *opd)
* opd.
*/
DBG_NOTICE("aio open request for %s/%s cancelled\n",
- opd->dname,
- opd->fname);
+ opd->dname->base_name,
+ opd->fname->base_name);
opd->conn = NULL;
/* Don't let opd go away. */
return -1;
@@ -373,8 +369,8 @@ static int open_async(const files_struct *fsp,
DEBUG(5,("open_async: mid %llu created for file %s/%s\n",
(unsigned long long)opd->mid,
- opd->dname,
- opd->fname));
+ opd->dname->base_name,
+ opd->fname->base_name));
/*
* Add a destructor to protect us from connection
@@ -408,8 +404,8 @@ static bool find_completed_open(files_struct *fsp,
"still in progress for "
"file %s/%s. PANIC !\n",
(unsigned long long)opd->mid,
- opd->dname,
- opd->fname));
+ opd->dname->base_name,
+ opd->fname->base_name));
/* Disaster ! This is an open timeout. Just panic. */
smb_panic("find_completed_open - in_progress\n");
/* notreached. */
diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c
index 7f4d65d4871..166fdc9feee 100644
--- a/source3/modules/vfs_ceph.c
+++ b/source3/modules/vfs_ceph.c
@@ -355,22 +355,24 @@ static int cephwrap_mkdirat(struct vfs_handle_struct *handle,
mode_t mode)
{
int result;
- char *parent = NULL;
- const char *path = smb_fname->base_name;
+ struct smb_filename *parent = NULL;
+ bool ok;
- DBG_DEBUG("[CEPH] mkdir(%p, %s)\n", handle, path);
+ DBG_DEBUG("[CEPH] mkdir(%p, %s)\n",
+ handle, smb_fname_str_dbg(smb_fname));
SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp);
- if (lp_inherit_acls(SNUM(handle->conn))
- && parent_dirname(talloc_tos(), path, &parent, NULL)
- && directory_has_default_acl(handle->conn, parent)) {
- mode = 0777;
+ if (lp_inherit_acls(SNUM(handle->conn))) {
+ ok = parent_smb_fname(talloc_tos(), smb_fname, &parent, NULL);
+ if (ok && directory_has_default_acl(handle->conn, parent)) {
+ mode = 0777;
+ }
}
TALLOC_FREE(parent);
- result = ceph_mkdir(handle->data, path, mode);
+ result = ceph_mkdir(handle->data, smb_fname->base_name, mode);
return WRAP_RETURN(result);
}
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index 2a7e04f79d1..a739b17963a 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -628,22 +628,23 @@ static int vfswrap_mkdirat(vfs_handle_struct *handle,
mode_t mode)
{
int result;
- const char *path = smb_fname->base_name;
- char *parent = NULL;
+ struct smb_filename *parent = NULL;
+ bool ok;
START_PROFILE(syscall_mkdirat);
SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp);
- if (lp_inherit_acls(SNUM(handle->conn))
- && parent_dirname(talloc_tos(), path, &parent, NULL)
- && directory_has_default_acl(handle->conn, parent)) {
- mode = (0777 & lp_directory_mask(SNUM(handle->conn)));
+ if (lp_inherit_acls(SNUM(handle->conn))) {
+ ok = parent_smb_fname(talloc_tos(), smb_fname, &parent, NULL);
+ if (ok && directory_has_default_acl(handle->conn, parent)) {
+ mode = (0777 & lp_directory_mask(SNUM(handle->conn)));
+ }
}
TALLOC_FREE(parent);
- result = mkdirat(dirfsp->fh->fd, path, mode);
+ result = mkdirat(dirfsp->fh->fd, smb_fname->base_name, mode);
END_PROFILE(syscall_mkdirat);
return result;
diff --git a/source3/modules/vfs_gpfs.c b/source3/modules/vfs_gpfs.c
index 26b2c52ba98..4014e92ada2 100644
--- a/source3/modules/vfs_gpfs.c
+++ b/source3/modules/vfs_gpfs.c
@@ -1895,29 +1895,32 @@ static int stat_with_capability(struct vfs_handle_struct *handle,
{
#if defined(HAVE_FSTATAT)
int fd = -1;
- bool b;
- char *dir_name;
- const char *rel_name = NULL;
+ bool ok;
+ struct smb_filename *dir_name = NULL;
+ struct smb_filename *rel_name = NULL;
struct stat st;
int ret = -1;
- b = parent_dirname(talloc_tos(), smb_fname->base_name,
- &dir_name, &rel_name);
- if (!b) {
+ ok = parent_smb_fname(talloc_tos(),
+ smb_fname,
+ &dir_name,
+ &rel_name);
+ if (!ok) {
errno = ENOMEM;
return -1;
}
- fd = open(dir_name, O_RDONLY, 0);
- TALLOC_FREE(dir_name);
+ fd = open(dir_name->base_name, O_RDONLY, 0);
if (fd == -1) {
+ TALLOC_FREE(dir_name);
return -1;
}
set_effective_capability(DAC_OVERRIDE_CAPABILITY);
- ret = fstatat(fd, rel_name, &st, flag);
+ ret = fstatat(fd, rel_name->base_name, &st, flag);
drop_effective_capability(DAC_OVERRIDE_CAPABILITY);
+ TALLOC_FREE(dir_name);
close(fd);
if (ret == 0) {
diff --git a/source3/modules/vfs_linux_xfs_sgid.c b/source3/modules/vfs_linux_xfs_sgid.c
index 2d62b299e1a..f112f119fae 100644
--- a/source3/modules/vfs_linux_xfs_sgid.c
+++ b/source3/modules/vfs_linux_xfs_sgid.c
@@ -27,9 +27,11 @@ static int linux_xfs_sgid_mkdirat(vfs_handle_struct *handle,
const struct smb_filename *smb_fname,
mode_t mode)
{
- struct smb_filename fname = { 0, };
+ struct smb_filename *dname = NULL;
+ struct smb_filename *fname = NULL;
int mkdir_res;
int res;
+ bool ok;
DEBUG(10, ("Calling linux_xfs_sgid_mkdirat(%s)\n",
smb_fname->base_name));
@@ -44,41 +46,47 @@ static int linux_xfs_sgid_mkdirat(vfs_handle_struct *handle,
return mkdir_res;
}
- if (!parent_dirname(talloc_tos(),
- smb_fname->base_name,
- &fname.base_name,
- NULL)) {
- DEBUG(1, ("parent_dirname failed\n"));
+ ok = parent_smb_fname(talloc_tos(), smb_fname, &dname, NULL);
+ if (!ok) {
+ DBG_WARNING("parent_smb_fname() failed\n");
/* return success, we did the mkdir */
return mkdir_res;
}
- res = SMB_VFS_NEXT_STAT(handle, &fname);
+ res = SMB_VFS_NEXT_STAT(handle, dname);
if (res == -1) {
- DEBUG(10, ("NEXT_STAT(%s) failed: %s\n", fname.base_name,
- strerror(errno)));
+ DBG_DEBUG("NEXT_STAT(%s) failed: %s\n",
+ smb_fname_str_dbg(dname),
+ strerror(errno));
/* return success, we did the mkdir */
return mkdir_res;
}
- TALLOC_FREE(fname.base_name);
- if ((fname.st.st_ex_mode & S_ISGID) == 0) {
+ if ((dname->st.st_ex_mode & S_ISGID) == 0) {
/* No SGID to inherit */
DEBUG(10, ("No SGID to inherit\n"));
+ TALLOC_FREE(dname);
return mkdir_res;
}
+ TALLOC_FREE(dname);
- fname.base_name = discard_const_p(char, smb_fname->base_name);
+ fname = cp_smb_filename(talloc_tos(), smb_fname);
+ if (fname == NULL) {
+ DBG_WARNING("cp_smb_filename() failed\n");
--
Samba Shared Repository
More information about the samba-cvs
mailing list