summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/vfs.h11
-rw-r--r--source3/include/vfs_macros.h8
-rw-r--r--source3/modules/onefs_system.c25
-rw-r--r--source3/modules/vfs_catia.c122
-rw-r--r--source3/modules/vfs_full_audit.c5
-rw-r--r--source3/smbd/vfs.c8
6 files changed, 78 insertions, 101 deletions
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index 38d60a0aec..ed49d1fd28 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -158,6 +158,11 @@ struct smb_filename;
handle = handle->next; \
}
+enum vfs_translate_direction {
+ vfs_translate_to_unix = 0,
+ vfs_translate_to_windows
+};
+
/*
Available VFS operations. These values must be in sync with vfs_ops struct
(struct vfs_fn_pointers and struct vfs_handle_pointers inside of struct vfs_ops).
@@ -302,7 +307,8 @@ struct vfs_fn_pointers {
struct lock_struct *plock);
NTSTATUS (*translate_name)(struct vfs_handle_struct *handle,
- char **mapped_name);
+ char **mapped_name,
+ enum vfs_translate_direction direction);
/* NT ACL operations. */
@@ -650,7 +656,8 @@ void smb_vfs_call_strict_unlock(struct vfs_handle_struct *handle,
struct files_struct *fsp,
struct lock_struct *plock);
NTSTATUS smb_vfs_call_translate_name(struct vfs_handle_struct *handle,
- char **mapped_name);
+ char **mapped_name,
+ enum vfs_translate_direction direction);
NTSTATUS smb_vfs_call_fget_nt_acl(struct vfs_handle_struct *handle,
struct files_struct *fsp,
uint32 security_info,
diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h
index 7cc5579e25..8ca7f373bf 100644
--- a/source3/include/vfs_macros.h
+++ b/source3/include/vfs_macros.h
@@ -345,10 +345,10 @@
#define SMB_VFS_NEXT_STRICT_UNLOCK(handle, fsp, plock) \
smb_vfs_call_strict_unlock((handle)->next, (fsp), (plock))
-#define SMB_VFS_TRANSLATE_NAME(conn, mapped_name) \
- smb_vfs_call_translate_name((conn)->vfs_handles, (mapped_name))
-#define SMB_VFS_NEXT_TRANSLATE_NAME(handle, mapped_name) \
- smb_vfs_call_translate_name((handle)->next, (mapped_name))
+#define SMB_VFS_TRANSLATE_NAME(conn, mapped_name, direction) \
+ smb_vfs_call_translate_name((conn)->vfs_handles, (mapped_name), (direction))
+#define SMB_VFS_NEXT_TRANSLATE_NAME(handle, mapped_name, direction) \
+ smb_vfs_call_translate_name((handle)->next, (mapped_name), (direction))
#define SMB_VFS_NEXT_STRICT_UNLOCK(handle, fsp, plock) \
smb_vfs_call_strict_unlock((handle)->next, (fsp), (plock))
diff --git a/source3/modules/onefs_system.c b/source3/modules/onefs_system.c
index d2f853f9ee..e3edc81608 100644
--- a/source3/modules/onefs_system.c
+++ b/source3/modules/onefs_system.c
@@ -98,9 +98,23 @@ int onefs_sys_create_file(connection_struct *conn,
int ret_fd = -1;
uint32_t onefs_dos_attributes;
struct ifs_createfile_flags cf_flags = CF_FLAGS_NONE;
+ char *mapped_name = NULL;
+ NTSTATUS result;
START_PROFILE(syscall_createfile);
+ /* Translate the name to UNIX before calling ifs_createfile */
+ mapped_name = talloc_strdup(talloc_tos(), path);
+ if (mapped_name == NULL) {
+ errno = ENOMEM;
+ goto out;
+ }
+ result = SMB_VFS_TRANSLATE_NAME(conn, &mapped_name,
+ vfs_translate_to_unix);
+ if (!NT_STATUS_IS_OK(result)) {
+ goto out;
+ }
+
/* Setup security descriptor and get secinfo. */
if (sd != NULL) {
NTSTATUS status;
@@ -148,7 +162,7 @@ int onefs_sys_create_file(connection_struct *conn,
PARM_ALLOW_EXECUTE_ALWAYS_DEFAULT) &&
(open_access_mask & FILE_EXECUTE)) {
- DEBUG(3, ("Stripping execute bit from %s: (0x%x)\n", path,
+ DEBUG(3, ("Stripping execute bit from %s: (0x%x)\n", mapped_name,
open_access_mask));
/* Strip execute. */
@@ -168,27 +182,27 @@ int onefs_sys_create_file(connection_struct *conn,
"open_access_mask = 0x%x, flags = 0x%x, mode = 0%o, "
"desired_oplock = %s, id = 0x%x, secinfo = 0x%x, sd = %p, "
"dos_attributes = 0x%x, path = %s, "
- "default_acl=%s\n", base_fd, path,
+ "default_acl=%s\n", base_fd, mapped_name,
(unsigned int)open_access_mask,
(unsigned int)flags,
(unsigned int)mode,
onefs_oplock_str(onefs_oplock),
(unsigned int)id,
sec_info_effective, sd,
- (unsigned int)onefs_dos_attributes, path,
+ (unsigned int)onefs_dos_attributes, mapped_name,
cf_flags_and_bool(cf_flags, CF_FLAGS_DEFAULT_ACL) ?
"true" : "false"));
/* Initialize smlock struct for files/dirs but not internal opens */
if (!(oplock_request & INTERNAL_OPEN_ONLY)) {
- smlock_init(conn, &sml, is_executable(path), access_mask,
+ smlock_init(conn, &sml, is_executable(mapped_name), access_mask,
share_access, create_options);
psml = &sml;
}
smlock_dump(10, psml);
- ret_fd = ifs_createfile(base_fd, path,
+ ret_fd = ifs_createfile(base_fd, mapped_name,
(enum ifs_ace_rights)open_access_mask, flags & ~O_ACCMODE, mode,
onefs_oplock, id, psml, sec_info_effective, pifs_sd,
onefs_dos_attributes, cf_flags, &onefs_granted_oplock);
@@ -206,6 +220,7 @@ int onefs_sys_create_file(connection_struct *conn,
out:
END_PROFILE(syscall_createfile);
aclu_free_sd(pifs_sd, false);
+ TALLOC_FREE(mapped_name);
return ret_fd;
}
diff --git a/source3/modules/vfs_catia.c b/source3/modules/vfs_catia.c
index d4001347ce..2631060441 100644
--- a/source3/modules/vfs_catia.c
+++ b/source3/modules/vfs_catia.c
@@ -28,9 +28,6 @@
#include "includes.h"
-#define TO_UNIX 0
-#define TO_WINDOWS 1
-
#define GLOBAL_SNUM 0xFFFFFFF
#define MAP_SIZE 0xFF
#define MAP_NUM 0x101 /* max unicode charval / MAP_SIZE */
@@ -61,8 +58,8 @@ static bool build_table(struct char_mappings **cmaps, int value)
return False;
for (i = 0; i < MAP_SIZE;i++) {
- (*cmaps)->entry[i][TO_UNIX] = start + i;
- (*cmaps)->entry[i][TO_WINDOWS] = start + i;
+ (*cmaps)->entry[i][vfs_translate_to_unix] = start + i;
+ (*cmaps)->entry[i][vfs_translate_to_windows] = start + i;
}
return True;
@@ -76,11 +73,11 @@ static void set_tables(struct char_mappings **cmaps,
/* set unix -> windows */
i = T_OFFSET(unix_map);
- cmaps[T_PICK(unix_map)]->entry[i][TO_WINDOWS] = windows_map;
+ cmaps[T_PICK(unix_map)]->entry[i][vfs_translate_to_windows] = windows_map;
/* set windows -> unix */
i = T_OFFSET(windows_map);
- cmaps[T_PICK(windows_map)]->entry[i][TO_UNIX] = unix_map;
+ cmaps[T_PICK(windows_map)]->entry[i][vfs_translate_to_unix] = unix_map;
}
static bool build_ranges(struct char_mappings **cmaps,
@@ -266,7 +263,7 @@ static SMB_STRUCT_DIR *catia_opendir(vfs_handle_struct *handle,
SMB_STRUCT_DIR *ret;
status = catia_string_replace_allocate(handle->conn, fname,
- &name_mapped, TO_UNIX);
+ &name_mapped, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return NULL;
@@ -283,7 +280,8 @@ static SMB_STRUCT_DIR *catia_opendir(vfs_handle_struct *handle,
* "WINDOWS displayable" name
*/
static NTSTATUS catia_translate_name(vfs_handle_struct *handle,
- char **mapped_name)
+ char **mapped_name,
+ enum vfs_translate_direction direction)
{
char *name = NULL;
NTSTATUS ret;
@@ -301,14 +299,14 @@ static NTSTATUS catia_translate_name(vfs_handle_struct *handle,
}
TALLOC_FREE(*mapped_name);
ret = catia_string_replace_allocate(handle->conn, name,
- mapped_name, TO_WINDOWS);
+ mapped_name, direction);
TALLOC_FREE(name);
if (!NT_STATUS_IS_OK(ret)) {
return ret;
}
- ret = SMB_VFS_NEXT_TRANSLATE_NAME(handle, mapped_name);
+ ret = SMB_VFS_NEXT_TRANSLATE_NAME(handle, mapped_name, direction);
return ret;
}
@@ -327,7 +325,7 @@ static int catia_open(vfs_handle_struct *handle,
tmp_base_name = smb_fname->base_name;
status = catia_string_replace_allocate(handle->conn,
smb_fname->base_name,
- &name_mapped, TO_UNIX);
+ &name_mapped, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -341,51 +339,6 @@ static int catia_open(vfs_handle_struct *handle,
return ret;
}
-/* @internal - Isilon create file support */
-static NTSTATUS catia_createfile(vfs_handle_struct *handle,
- struct smb_request *req,
- uint16_t root_dir_fid,
- struct smb_filename *smb_fname,
- uint32_t access_mask,
- uint32_t share_access,
- uint32_t create_disposition,
- uint32_t create_options,
- uint32_t file_attributes,
- uint32_t oplock_request,
- uint64_t allocation_size,
- struct security_descriptor *sd,
- struct ea_list *ea_list,
- files_struct **result,
- int *pinfo)
-{
- char *name_mapped = NULL;
- char *tmp_base_name;
- NTSTATUS ret;
-
- ret = catia_string_replace_allocate(handle->conn, smb_fname->base_name,
- &name_mapped, TO_UNIX);
- if (!NT_STATUS_IS_OK(ret)) {
- errno = map_errno_from_nt_status(ret);
- return ret;
- }
-
- tmp_base_name = smb_fname->base_name;
- DEBUG(5, ("catia_createfile converted %s->%s (orginally %s)\n",
- tmp_base_name, name_mapped, tmp_base_name));
- smb_fname->base_name = name_mapped;
- ret = SMB_VFS_NEXT_CREATE_FILE(handle, req, root_dir_fid,
- smb_fname, access_mask, share_access,
- create_disposition, create_options,
- file_attributes, oplock_request,
- allocation_size, sd, ea_list,
- result, pinfo);
-
- smb_fname->base_name = tmp_base_name;
- TALLOC_FREE(name_mapped);
-
- return ret;
-}
-
static int catia_rename(vfs_handle_struct *handle,
const struct smb_filename *smb_fname_src,
const struct smb_filename *smb_fname_dst)
@@ -400,7 +353,7 @@ static int catia_rename(vfs_handle_struct *handle,
status = catia_string_replace_allocate(handle->conn,
smb_fname_src->base_name,
- &src_name_mapped, TO_UNIX);
+ &src_name_mapped, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -408,7 +361,7 @@ static int catia_rename(vfs_handle_struct *handle,
status = catia_string_replace_allocate(handle->conn,
smb_fname_dst->base_name,
- &dst_name_mapped, TO_UNIX);
+ &dst_name_mapped, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -455,7 +408,7 @@ static int catia_stat(vfs_handle_struct *handle,
status = catia_string_replace_allocate(handle->conn,
smb_fname->base_name,
- &name, TO_UNIX);
+ &name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -481,7 +434,7 @@ static int catia_lstat(vfs_handle_struct *handle,
status = catia_string_replace_allocate(handle->conn,
smb_fname->base_name,
- &name, TO_UNIX);
+ &name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -507,7 +460,7 @@ static int catia_unlink(vfs_handle_struct *handle,
status = catia_string_replace_allocate(handle->conn,
smb_fname->base_name,
- &name, TO_UNIX);
+ &name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -538,7 +491,7 @@ static int catia_chown(vfs_handle_struct *handle,
int ret;
status = catia_string_replace_allocate(handle->conn, path,
- &name, TO_UNIX);
+ &name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -560,7 +513,7 @@ static int catia_lchown(vfs_handle_struct *handle,
int ret;
status = catia_string_replace_allocate(handle->conn, path,
- &name, TO_UNIX);
+ &name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -580,7 +533,7 @@ static int catia_rmdir(vfs_handle_struct *handle,
int ret;
status = catia_string_replace_allocate(handle->conn, path,
- &name, TO_UNIX);
+ &name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -601,7 +554,7 @@ static int catia_mkdir(vfs_handle_struct *handle,
int ret;
status = catia_string_replace_allocate(handle->conn, path,
- &name, TO_UNIX);
+ &name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -621,7 +574,7 @@ static int catia_chdir(vfs_handle_struct *handle,
int ret;
status = catia_string_replace_allocate(handle->conn, path,
- &name, TO_UNIX);
+ &name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -644,7 +597,7 @@ static int catia_ntimes(vfs_handle_struct *handle,
status = catia_string_replace_allocate(handle->conn,
smb_fname->base_name,
- &name, TO_UNIX);
+ &name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -673,7 +626,7 @@ catia_realpath(vfs_handle_struct *handle, const char *path,
char *ret = NULL;
status = catia_string_replace_allocate(handle->conn, path,
- &mapped_name, TO_UNIX);
+ &mapped_name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return NULL;
@@ -693,7 +646,7 @@ static int catia_chflags(struct vfs_handle_struct *handle,
int ret;
status = catia_string_replace_allocate(handle->conn, path,
- &mapped_name, TO_UNIX);
+ &mapped_name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -717,7 +670,7 @@ catia_streaminfo(struct vfs_handle_struct *handle,
NTSTATUS status;
status = catia_string_replace_allocate(handle->conn, path,
- &mapped_name, TO_UNIX);
+ &mapped_name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return status;
@@ -740,7 +693,7 @@ catia_get_nt_acl(struct vfs_handle_struct *handle,
NTSTATUS status;
status = catia_string_replace_allocate(handle->conn,
- path, &mapped_name, TO_UNIX);
+ path, &mapped_name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return status;
@@ -762,7 +715,7 @@ catia_chmod_acl(vfs_handle_struct *handle,
int ret;
status = catia_string_replace_allocate(handle->conn,
- path, &mapped_name, TO_UNIX);
+ path, &mapped_name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -783,7 +736,7 @@ catia_sys_acl_get_file(vfs_handle_struct *handle,
SMB_ACL_T ret;
status = catia_string_replace_allocate(handle->conn,
- path, &mapped_name, TO_UNIX);
+ path, &mapped_name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return NULL;
@@ -806,7 +759,7 @@ catia_sys_acl_set_file(vfs_handle_struct *handle,
int ret;
status = catia_string_replace_allocate(handle->conn,
- path, &mapped_name, TO_UNIX);
+ path, &mapped_name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -827,7 +780,7 @@ catia_sys_acl_delete_def_file(vfs_handle_struct *handle,
int ret;
status = catia_string_replace_allocate(handle->conn,
- path, &mapped_name, TO_UNIX);
+ path, &mapped_name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -848,7 +801,7 @@ catia_getxattr(vfs_handle_struct *handle, const char *path,
ssize_t ret;
status = catia_string_replace_allocate(handle->conn,
- name, &mapped_name, TO_UNIX);
+ name, &mapped_name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -870,7 +823,7 @@ catia_lgetxattr(vfs_handle_struct *handle, const char *path,
ssize_t ret;
status = catia_string_replace_allocate(handle->conn,
- name, &mapped_name, TO_UNIX);
+ name, &mapped_name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -892,7 +845,7 @@ catia_listxattr(vfs_handle_struct *handle, const char *path,
ssize_t ret;
status = catia_string_replace_allocate(handle->conn,
- path, &mapped_name, TO_UNIX);
+ path, &mapped_name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -914,7 +867,7 @@ catia_llistxattr(vfs_handle_struct *handle, const char *path,
ssize_t ret;
status = catia_string_replace_allocate(handle->conn,
- path, &mapped_name, TO_UNIX);
+ path, &mapped_name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -936,7 +889,7 @@ catia_removexattr(vfs_handle_struct *handle, const char *path,
ssize_t ret;
status = catia_string_replace_allocate(handle->conn,
- name, &mapped_name, TO_UNIX);
+ name, &mapped_name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -958,7 +911,7 @@ catia_lremovexattr(vfs_handle_struct *handle, const char *path,
ssize_t ret;
status = catia_string_replace_allocate(handle->conn,
- name, &mapped_name, TO_UNIX);
+ name, &mapped_name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -981,7 +934,7 @@ catia_setxattr(vfs_handle_struct *handle, const char *path,
ssize_t ret;
status = catia_string_replace_allocate(handle->conn,
- name, &mapped_name, TO_UNIX);
+ name, &mapped_name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -1004,7 +957,7 @@ catia_lsetxattr(vfs_handle_struct *handle, const char *path,
ssize_t ret;
status = catia_string_replace_allocate(handle->conn,
- name, &mapped_name, TO_UNIX);
+ name, &mapped_name, vfs_translate_to_unix);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
@@ -1022,7 +975,6 @@ static struct vfs_fn_pointers vfs_catia_fns = {
.rmdir = catia_rmdir,
.opendir = catia_opendir,
.open = catia_open,
- .create_file = catia_createfile,
.rename = catia_rename,
.stat = catia_stat,
.lstat = catia_lstat,
diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c
index b5c9e6bd9c..22abee416c 100644
--- a/source3/modules/vfs_full_audit.c
+++ b/source3/modules/vfs_full_audit.c
@@ -1518,11 +1518,12 @@ static void smb_full_audit_strict_unlock(struct vfs_handle_struct *handle,
}
static NTSTATUS smb_full_audit_translate_name(vfs_handle_struct *handle,
- char **mapped_name)
+ char **mapped_name,
+ enum vfs_translate_direction direction)
{
NTSTATUS result;
- result = SMB_VFS_NEXT_TRANSLATE_NAME(handle, mapped_name);
+ result = SMB_VFS_NEXT_TRANSLATE_NAME(handle, mapped_name, direction);
do_log(SMB_VFS_OP_TRANSLATE_NAME, NT_STATUS_IS_OK(result), handle, "");
diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c
index 42ff8b19cd..9b2df42c58 100644
--- a/source3/smbd/vfs.c
+++ b/source3/smbd/vfs.c
@@ -677,7 +677,8 @@ char *vfs_readdirname(connection_struct *conn, void *p, SMB_STRUCT_STAT *sbuf)
errno = ENOMEM;
return NULL;
}
- result = SMB_VFS_TRANSLATE_NAME(conn, &dname);
+ result = SMB_VFS_TRANSLATE_NAME(conn, &dname,
+ vfs_translate_to_windows);
if (!NT_STATUS_IS_OK(result)) {
TALLOC_FREE(dname);
return NULL;
@@ -1506,10 +1507,11 @@ void smb_vfs_call_strict_unlock(struct vfs_handle_struct *handle,
}
NTSTATUS smb_vfs_call_translate_name(struct vfs_handle_struct *handle,
- char **mapped_name)
+ char **mapped_name,
+ enum vfs_translate_direction direction)
{
VFS_FIND(translate_name);
- return handle->fns->translate_name(handle, mapped_name);
+ return handle->fns->translate_name(handle, mapped_name, direction);
}
NTSTATUS smb_vfs_call_fget_nt_acl(struct vfs_handle_struct *handle,