diff options
-rw-r--r-- | examples/VFS/skel_opaque.c | 6 | ||||
-rw-r--r-- | examples/VFS/skel_transparent.c | 8 | ||||
-rw-r--r-- | source3/include/vfs.h | 13 | ||||
-rw-r--r-- | source3/include/vfs_macros.h | 8 | ||||
-rw-r--r-- | source3/modules/vfs_cap.c | 28 | ||||
-rw-r--r-- | source3/modules/vfs_catia.c | 25 | ||||
-rw-r--r-- | source3/modules/vfs_ceph.c | 13 | ||||
-rw-r--r-- | source3/modules/vfs_default.c | 7 | ||||
-rw-r--r-- | source3/modules/vfs_fake_acls.c | 19 | ||||
-rw-r--r-- | source3/modules/vfs_fruit.c | 24 | ||||
-rw-r--r-- | source3/modules/vfs_full_audit.c | 8 | ||||
-rw-r--r-- | source3/modules/vfs_glusterfs.c | 6 | ||||
-rw-r--r-- | source3/modules/vfs_media_harmony.c | 25 | ||||
-rw-r--r-- | source3/modules/vfs_netatalk.c | 11 | ||||
-rw-r--r-- | source3/modules/vfs_shadow_copy2.c | 30 | ||||
-rw-r--r-- | source3/modules/vfs_snapper.c | 33 | ||||
-rw-r--r-- | source3/modules/vfs_time_audit.c | 10 | ||||
-rw-r--r-- | source3/modules/vfs_unityed_media.c | 22 | ||||
-rw-r--r-- | source3/smbd/pysmbd.c | 14 | ||||
-rw-r--r-- | source3/smbd/vfs.c | 10 | ||||
-rw-r--r-- | source3/torture/cmd_vfs.c | 12 |
21 files changed, 240 insertions, 92 deletions
diff --git a/examples/VFS/skel_opaque.c b/examples/VFS/skel_opaque.c index e7bb645f165..57f5b0921f0 100644 --- a/examples/VFS/skel_opaque.c +++ b/examples/VFS/skel_opaque.c @@ -382,8 +382,10 @@ static int skel_fchmod(vfs_handle_struct *handle, files_struct *fsp, return -1; } -static int skel_chown(vfs_handle_struct *handle, const char *path, - uid_t uid, gid_t gid) +static int skel_chown(vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + uid_t uid, + gid_t gid) { errno = ENOSYS; return -1; diff --git a/examples/VFS/skel_transparent.c b/examples/VFS/skel_transparent.c index fe2356a6e69..d320da95118 100644 --- a/examples/VFS/skel_transparent.c +++ b/examples/VFS/skel_transparent.c @@ -488,10 +488,12 @@ static int skel_fchmod(vfs_handle_struct *handle, files_struct *fsp, return SMB_VFS_NEXT_FCHMOD(handle, fsp, mode); } -static int skel_chown(vfs_handle_struct *handle, const char *path, uid_t uid, - gid_t gid) +static int skel_chown(vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + uid_t uid, + gid_t gid) { - return SMB_VFS_NEXT_CHOWN(handle, path, uid, gid); + return SMB_VFS_NEXT_CHOWN(handle, smb_fname, uid, gid); } static int skel_fchown(vfs_handle_struct *handle, files_struct *fsp, diff --git a/source3/include/vfs.h b/source3/include/vfs.h index c8e049487dc..4b3ac0372ad 100644 --- a/source3/include/vfs.h +++ b/source3/include/vfs.h @@ -184,6 +184,8 @@ const struct smb_filename * */ /* Version 35 - Change chmod_acl from const char *, to const struct smb_filename * */ +/* Version 35 - Change chown from const char *, to + const struct smb_filename * */ #define SMB_VFS_INTERFACE_VERSION 35 @@ -646,7 +648,10 @@ struct vfs_fn_pointers { const struct smb_filename *smb_fname, mode_t mode); int (*fchmod_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, mode_t mode); - int (*chown_fn)(struct vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid); + int (*chown_fn)(struct vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + uid_t uid, + gid_t gid); int (*fchown_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, uid_t uid, gid_t gid); int (*lchown_fn)(struct vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid); int (*chdir_fn)(struct vfs_handle_struct *handle, const char *path); @@ -1095,8 +1100,10 @@ int smb_vfs_call_chmod(struct vfs_handle_struct *handle, mode_t mode); int smb_vfs_call_fchmod(struct vfs_handle_struct *handle, struct files_struct *fsp, mode_t mode); -int smb_vfs_call_chown(struct vfs_handle_struct *handle, const char *path, - uid_t uid, gid_t gid); +int smb_vfs_call_chown(struct vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + uid_t uid, + gid_t gid); int smb_vfs_call_fchown(struct vfs_handle_struct *handle, struct files_struct *fsp, uid_t uid, gid_t gid); int smb_vfs_call_lchown(struct vfs_handle_struct *handle, const char *path, diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h index e5e3c99866d..5fbd779c0a5 100644 --- a/source3/include/vfs_macros.h +++ b/source3/include/vfs_macros.h @@ -251,10 +251,10 @@ #define SMB_VFS_NEXT_FCHMOD(handle, fsp, mode) \ smb_vfs_call_fchmod((handle)->next, (fsp), (mode)) -#define SMB_VFS_CHOWN(conn, path, uid, gid) \ - smb_vfs_call_chown((conn)->vfs_handles, (path), (uid), (gid)) -#define SMB_VFS_NEXT_CHOWN(handle, path, uid, gid) \ - smb_vfs_call_chown((handle)->next, (path), (uid), (gid)) +#define SMB_VFS_CHOWN(conn, smb_fname, uid, gid) \ + smb_vfs_call_chown((conn)->vfs_handles, (smb_fname), (uid), (gid)) +#define SMB_VFS_NEXT_CHOWN(handle, smb_fname, uid, gid) \ + smb_vfs_call_chown((handle)->next, (smb_fname), (uid), (gid)) #define SMB_VFS_FCHOWN(fsp, uid, gid) \ smb_vfs_call_fchown((fsp)->conn->vfs_handles, (fsp), (uid), (gid)) diff --git a/source3/modules/vfs_cap.c b/source3/modules/vfs_cap.c index 0bb943da9a2..f58977b5aa9 100644 --- a/source3/modules/vfs_cap.c +++ b/source3/modules/vfs_cap.c @@ -336,15 +336,37 @@ static int cap_chmod(vfs_handle_struct *handle, return ret; } -static int cap_chown(vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid) +static int cap_chown(vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + uid_t uid, + gid_t gid) { - char *cappath = capencode(talloc_tos(), path); + struct smb_filename *cap_smb_fname = NULL; + char *cappath = capencode(talloc_tos(), smb_fname->base_name); + int ret; + int saved_errno; if (!cappath) { errno = ENOMEM; return -1; } - return SMB_VFS_NEXT_CHOWN(handle, cappath, uid, gid); + + cap_smb_fname = synthetic_smb_fname(talloc_tos(), + cappath, + NULL, + NULL); + if (cap_smb_fname == NULL) { + TALLOC_FREE(cappath); + errno = ENOMEM; + return -1; + } + + ret = SMB_VFS_NEXT_CHOWN(handle, cap_smb_fname, uid, gid); + saved_errno = errno; + TALLOC_FREE(cappath); + TALLOC_FREE(cap_smb_fname); + errno = saved_errno; + return ret; } static int cap_lchown(vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid) diff --git a/source3/modules/vfs_catia.c b/source3/modules/vfs_catia.c index e142ccef8ef..814f474c079 100644 --- a/source3/modules/vfs_catia.c +++ b/source3/modules/vfs_catia.c @@ -522,24 +522,39 @@ static int catia_unlink(vfs_handle_struct *handle, } static int catia_chown(vfs_handle_struct *handle, - const char *path, + const struct smb_filename *smb_fname, uid_t uid, gid_t gid) { char *name = NULL; NTSTATUS status; int ret; + int saved_errno; + struct smb_filename *catia_smb_fname = NULL; - status = catia_string_replace_allocate(handle->conn, path, - &name, vfs_translate_to_unix); + status = catia_string_replace_allocate(handle->conn, + smb_fname->base_name, + &name, + vfs_translate_to_unix); if (!NT_STATUS_IS_OK(status)) { errno = map_errno_from_nt_status(status); return -1; } + catia_smb_fname = synthetic_smb_fname(talloc_tos(), + name, + NULL, + NULL); + if (catia_smb_fname == NULL) { + TALLOC_FREE(name); + errno = ENOMEM; + return -1; + } - ret = SMB_VFS_NEXT_CHOWN(handle, name, uid, gid); + ret = SMB_VFS_NEXT_CHOWN(handle, catia_smb_fname, uid, gid); + saved_errno = errno; TALLOC_FREE(name); - + TALLOC_FREE(catia_smb_fname); + errno = saved_errno; return ret; } diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c index 82e15c8dfcc..d185bd0c0b5 100644 --- a/source3/modules/vfs_ceph.c +++ b/source3/modules/vfs_ceph.c @@ -697,11 +697,18 @@ static int cephwrap_fchmod(struct vfs_handle_struct *handle, files_struct *fsp, return -1; } -static int cephwrap_chown(struct vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid) +static int cephwrap_chown(struct vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + uid_t uid, + gid_t gid) { int result; - DEBUG(10, ("[CEPH] chown(%p, %s, %d, %d)\n", handle, path, uid, gid)); - result = ceph_chown(handle->data, path, uid, gid); + DEBUG(10, ("[CEPH] chown(%p, %s, %d, %d)\n", + handle, + smb_fname->base_name, + uid, + gid)); + result = ceph_chown(handle->data, smb_fname->base_name, uid, gid); DEBUG(10, ("[CEPH] chown(...) = %d\n", result)); WRAP_RETURN(result); } diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index bb55facbb08..604ee4519b7 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -1744,12 +1744,15 @@ static int vfswrap_fchmod(vfs_handle_struct *handle, files_struct *fsp, mode_t m return result; } -static int vfswrap_chown(vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid) +static int vfswrap_chown(vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + uid_t uid, + gid_t gid) { int result; START_PROFILE(syscall_chown); - result = chown(path, uid, gid); + result = chown(smb_fname->base_name, uid, gid); END_PROFILE(syscall_chown); return result; } diff --git a/source3/modules/vfs_fake_acls.c b/source3/modules/vfs_fake_acls.c index 3887e86746e..cb907d0ca98 100644 --- a/source3/modules/vfs_fake_acls.c +++ b/source3/modules/vfs_fake_acls.c @@ -393,20 +393,33 @@ static int fake_acls_sys_acl_delete_def_file(vfs_handle_struct *handle, const ch return ret; } -static int fake_acls_chown(vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid) +static int fake_acls_chown(vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + uid_t uid, + gid_t gid) { int ret; uint8_t id_buf[4]; if (uid != -1) { SIVAL(id_buf, 0, uid); - ret = SMB_VFS_NEXT_SETXATTR(handle, path, FAKE_UID, id_buf, sizeof(id_buf), 0); + ret = SMB_VFS_NEXT_SETXATTR(handle, + smb_fname->base_name, + FAKE_UID, + id_buf, + sizeof(id_buf), + 0); if (ret != 0) { return ret; } } if (gid != -1) { SIVAL(id_buf, 0, gid); - ret = SMB_VFS_NEXT_SETXATTR(handle, path, FAKE_GID, id_buf, sizeof(id_buf), 0); + ret = SMB_VFS_NEXT_SETXATTR(handle, + smb_fname->base_name, + FAKE_GID, + id_buf, + sizeof(id_buf), + 0); if (ret != 0) { return ret; } diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c index 49cfa0c3c07..73b5f3a53b8 100644 --- a/source3/modules/vfs_fruit.c +++ b/source3/modules/vfs_fruit.c @@ -2545,16 +2545,17 @@ static int fruit_chmod(vfs_handle_struct *handle, } static int fruit_chown(vfs_handle_struct *handle, - const char *path, + const struct smb_filename *smb_fname, uid_t uid, gid_t gid) { int rc = -1; char *adp = NULL; struct fruit_config_data *config = NULL; + struct smb_filename *adp_smb_fname = NULL; SMB_STRUCT_STAT sb; - rc = SMB_VFS_NEXT_CHOWN(handle, path, uid, gid); + rc = SMB_VFS_NEXT_CHOWN(handle, smb_fname, uid, gid); if (rc != 0) { return rc; } @@ -2566,26 +2567,37 @@ static int fruit_chown(vfs_handle_struct *handle, return rc; } - /* FIXME: direct sys_lstat(), missing smb_fname */ - rc = sys_lstat(path, &sb, false); + /* FIXME: direct sys_lstat(), need non-const smb_fname */ + rc = sys_lstat(smb_fname->base_name, &sb, false); if (rc != 0 || !S_ISREG(sb.st_ex_mode)) { return rc; } - rc = adouble_path(talloc_tos(), path, &adp); + rc = adouble_path(talloc_tos(), smb_fname->base_name, &adp); if (rc != 0) { goto done; } DEBUG(10, ("fruit_chown: %s\n", adp)); - rc = SMB_VFS_NEXT_CHOWN(handle, adp, uid, gid); + adp_smb_fname = synthetic_smb_fname(talloc_tos(), + adp, + NULL, + NULL); + if (adp_smb_fname == NULL) { + errno = ENOMEM; + rc = -1; + goto done; + } + + rc = SMB_VFS_NEXT_CHOWN(handle, adp_smb_fname, uid, gid); if (errno == ENOENT) { rc = 0; } done: TALLOC_FREE(adp); + TALLOC_FREE(adp_smb_fname); return rc; } diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c index 4a7b3588941..309158a41c2 100644 --- a/source3/modules/vfs_full_audit.c +++ b/source3/modules/vfs_full_audit.c @@ -1422,14 +1422,16 @@ static int smb_full_audit_fchmod(vfs_handle_struct *handle, files_struct *fsp, } static int smb_full_audit_chown(vfs_handle_struct *handle, - const char *path, uid_t uid, gid_t gid) + const struct smb_filename *smb_fname, + uid_t uid, + gid_t gid) { int result; - result = SMB_VFS_NEXT_CHOWN(handle, path, uid, gid); + result = SMB_VFS_NEXT_CHOWN(handle, smb_fname, uid, gid); do_log(SMB_VFS_OP_CHOWN, (result >= 0), handle, "%s|%ld|%ld", - path, (long int)uid, (long int)gid); + smb_fname->base_name, (long int)uid, (long int)gid); return result; } diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c index 2008342229d..b61bb14ffa4 100644 --- a/source3/modules/vfs_glusterfs.c +++ b/source3/modules/vfs_glusterfs.c @@ -942,9 +942,11 @@ static int vfs_gluster_fchmod(struct vfs_handle_struct *handle, } static int vfs_gluster_chown(struct vfs_handle_struct *handle, - const char *path, uid_t uid, gid_t gid) + const struct smb_filename *smb_fname, + uid_t uid, + gid_t gid) { - return glfs_chown(handle->data, path, uid, gid); + return glfs_chown(handle->data, smb_fname->base_name, uid, gid); } static int vfs_gluster_fchown(struct vfs_handle_struct *handle, diff --git a/source3/modules/vfs_media_harmony.c b/source3/modules/vfs_media_harmony.c index e1f05ccdbee..73b418ef181 100644 --- a/source3/modules/vfs_media_harmony.c +++ b/source3/modules/vfs_media_harmony.c @@ -1580,34 +1580,31 @@ out: * Failure: set errno, return -1 */ static int mh_chown(vfs_handle_struct *handle, - const char *path, + const struct smb_filename *smb_fname, uid_t uid, gid_t gid) { int status; - char *clientPath; - TALLOC_CTX *ctx; + struct smb_filename *clientFname = NULL; DEBUG(MH_INFO_DEBUG, ("Entering mh_chown\n")); - if (!is_in_media_files(path)) + if (!is_in_media_files(smb_fname->base_name)) { - status = SMB_VFS_NEXT_CHOWN(handle, path, uid, gid); + status = SMB_VFS_NEXT_CHOWN(handle, smb_fname, uid, gid); goto out; } - clientPath = NULL; - ctx = talloc_tos(); - - if ((status = alloc_get_client_path(handle, ctx, - path, - &clientPath))) - { + status = alloc_get_client_smb_fname(handle, + talloc_tos(), + smb_fname, + &clientFname); + if (status != 0) { goto err; } - status = SMB_VFS_NEXT_CHOWN(handle, clientPath, uid, gid); + status = SMB_VFS_NEXT_CHOWN(handle, clientFname, uid, gid); err: - TALLOC_FREE(clientPath); + TALLOC_FREE(clientFname); out: return status; } diff --git a/source3/modules/vfs_netatalk.c b/source3/modules/vfs_netatalk.c index 4bb26d09dce..13ad402f89b 100644 --- a/source3/modules/vfs_netatalk.c +++ b/source3/modules/vfs_netatalk.c @@ -397,7 +397,10 @@ exit_chmod: return ret; } -static int atalk_chown(struct vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid) +static int atalk_chown(struct vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + uid_t uid, + gid_t gid) { int ret = 0; char *adbl_path = 0; @@ -406,14 +409,12 @@ static int atalk_chown(struct vfs_handle_struct *handle, const char *path, uid_t SMB_STRUCT_STAT orig_info; TALLOC_CTX *ctx; - ret = SMB_VFS_NEXT_CHOWN(handle, path, uid, gid); - - if (!path) return ret; + ret = SMB_VFS_NEXT_CHOWN(handle, smb_fname, uid, gid); if (!(ctx = talloc_init("chown_file"))) return ret; - if (atalk_build_paths(ctx, handle->conn->cwd, path, + if (atalk_build_paths(ctx, handle->conn->cwd, smb_fname->base_name, &adbl_path, &orig_path, &adbl_info, &orig_info) != 0) goto exit_chown; diff --git a/source3/modules/vfs_shadow_copy2.c b/source3/modules/vfs_shadow_copy2.c index c83ce1e529f..c63d67603d3 100644 --- a/source3/modules/vfs_shadow_copy2.c +++ b/source3/modules/vfs_shadow_copy2.c @@ -1013,29 +1013,45 @@ static int shadow_copy2_chmod(vfs_handle_struct *handle, return ret; } -static int shadow_copy2_chown(vfs_handle_struct *handle, const char *fname, - uid_t uid, gid_t gid) +static int shadow_copy2_chown(vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + uid_t uid, + gid_t gid) { time_t timestamp; char *stripped; int ret, saved_errno; - char *conv; + char *conv = NULL; + struct smb_filename *conv_smb_fname = NULL; - if (!shadow_copy2_strip_snapshot(talloc_tos(), handle, fname, - ×tamp, &stripped)) { + if (!shadow_copy2_strip_snapshot(talloc_tos(), + handle, + smb_fname->base_name, + ×tamp, + &stripped)) { return -1; } if (timestamp == 0) { - return SMB_VFS_NEXT_CHOWN(handle, fname, uid, gid); + return SMB_VFS_NEXT_CHOWN(handle, smb_fname, uid, gid); } conv = shadow_copy2_convert(talloc_tos(), handle, stripped, timestamp); TALLOC_FREE(stripped); if (conv == NULL) { return -1; } - ret = SMB_VFS_NEXT_CHOWN(handle, conv, uid, gid); + conv_smb_fname = synthetic_smb_fname(talloc_tos(), + conv, + NULL, + NULL); + if (conv_smb_fname == NULL) { + TALLOC_FREE(conv); + errno = ENOMEM; + return -1; + } + ret = SMB_VFS_NEXT_CHOWN(handle, conv_smb_fname, uid, gid); saved_errno = errno; TALLOC_FREE(conv); + TALLOC_FREE(conv_smb_fname); errno = saved_errno; return ret; } diff --git a/source3/modules/vfs_snapper.c b/source3/modules/vfs_snapper.c index fb9936931c0..11a99d97b79 100644 --- a/source3/modules/vfs_snapper.c +++ b/source3/modules/vfs_snapper.c @@ -2259,29 +2259,46 @@ static int snapper_gmt_chmod(vfs_handle_struct *handle, return ret; } -static int snapper_gmt_chown(vfs_handle_struct *handle, const char *fname, - uid_t uid, gid_t gid) +static int snapper_gmt_chown(vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + uid_t uid, + gid_t gid) { time_t timestamp; - char *stripped; + char *stripped = NULL; int ret, saved_errno; - char *conv; + char *conv = NULL; + struct smb_filename *conv_smb_fname = NULL; - if (!snapper_gmt_strip_snapshot(talloc_tos(), handle, fname, - ×tamp, &stripped)) { + if (!snapper_gmt_strip_snapshot(talloc_tos(), + handle, + smb_fname->base_name, + ×tamp, + &stripped)) { return -1; } if (timestamp == 0) { - return SMB_VFS_NEXT_CHOWN(handle, fname, uid, gid); + TALLOC_FREE(stripped); + return SMB_VFS_NEXT_CHOWN(handle, smb_fname, uid, gid); } conv = snapper_gmt_convert(talloc_tos(), handle, stripped, timestamp); TALLOC_FREE(stripped); if (conv == NULL) { return -1; } - ret = SMB_VFS_NEXT_CHOWN(handle, conv, uid, gid); + conv_smb_fname = synthetic_smb_fname(talloc_tos(), + conv, + NULL, + NULL); + if (conv_smb_fname == NULL) { + TALLOC_FREE(conv); + errno = ENOMEM; + return -1; + } + ret = SMB_VFS_NEXT_CHOWN(handle, conv_smb_fname, uid, gid); saved_errno = errno; TALLOC_FREE(conv); + TALLOC_FREE(conv_smb_fname); errno = saved_errno; return ret; } diff --git a/source3/modules/vfs_time_audit.c b/source3/modules/vfs_time_audit.c index 944251d934d..68bc84b58d9 100644 --- a/source3/modules/vfs_time_audit.c +++ b/source3/modules/vfs_time_audit.c @@ -1143,19 +1143,23 @@ static int smb_time_audit_fchmod(vfs_handle_struct *handle, files_struct *fsp, } static int smb_time_audit_chown(vfs_handle_struct *handle, - const char *path, uid_t uid, gid_t gid) + const struct smb_filename *smb_fname, + uid_t uid, + gid_t gid) { int result; struct timespec ts1,ts2; double timediff; clock_gettime_mono(&ts1); - result = SMB_VFS_NEXT_CHOWN(handle, path, uid, gid); + result = SMB_VFS_NEXT_CHOWN(handle, smb_fname, uid, gid); clock_gettime_mono(&ts2); timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9; if (timediff > audit_timeout) { - smb_time_audit_log_fname("chown", timediff, path); + smb_time_audit_log_fname("chown", + timediff, + smb_fname->base_name); } return result; diff --git a/source3/modules/vfs_unityed_media.c b/source3/modules/vfs_unityed_media.c index dd6dc335dd8..84191cc571f 100644 --- a/source3/modules/vfs_unityed_media.c +++ b/source3/modules/vfs_unityed_media.c @@ -1207,29 +1207,31 @@ err: } static int um_chown(vfs_handle_struct *handle, - const char *path, - uid_t uid, - gid_t gid) + const struct smb_filename *smb_fname, + uid_t uid, + gid_t gid) { int status; - char *client_path = NULL; + struct smb_filename *client_fname = NULL; DEBUG(10, ("Entering um_chown\n")); - if (!is_in_media_files(path)) { - return SMB_VFS_NEXT_CHOWN(handle, path, uid, gid); + if (!is_in_media_files(smb_fname->base_name)) { + return SMB_VFS_NEXT_CHOWN(handle, smb_fname, uid, gid); } - status = alloc_get_client_path(handle, talloc_tos(), - path, &client_path); + status = alloc_get_client_smb_fname(handle, + talloc_tos(), + smb_fname, + &client_fname); if (status != 0) { goto err; } - status = SMB_VFS_NEXT_CHOWN(handle, client_path, uid, gid); + status = SMB_VFS_NEXT_CHOWN(handle, client_fname, uid, gid); err: - TALLOC_FREE(client_path); + TALLOC_FREE(client_fname); return status; } diff --git a/source3/smbd/pysmbd.c b/source3/smbd/pysmbd.c index cd6a1e2e724..68bc3e75849 100644 --- a/source3/smbd/pysmbd.c +++ b/source3/smbd/pysmbd.c @@ -375,6 +375,7 @@ static PyObject *py_smbd_chown(PyObject *self, PyObject *args, PyObject *kwargs) int uid, gid; TALLOC_CTX *frame; mode_t saved_umask; + struct smb_filename *smb_fname = NULL; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "sii|z", discard_const_p(char *, kwnames), @@ -392,7 +393,18 @@ static PyObject *py_smbd_chown(PyObject *self, PyObject *args, PyObject *kwargs) so set our umask to 0 */ saved_umask = umask(0); - ret = SMB_VFS_CHOWN( conn, fname, uid, gid); + smb_fname = synthetic_smb_fname(talloc_tos(), + fname, + NULL, + NULL); + if (smb_fname == NULL) { + umask(saved_umask); + TALLOC_FREE(frame); + errno = ENOMEM; + return PyErr_SetFromErrno(PyExc_OSError); + } + + ret = SMB_VFS_CHOWN(conn, smb_fname, uid, gid); if (ret != 0) { umask(saved_umask); TALLOC_FREE(frame); diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c index 02a94e86f53..8b87b32f4b1 100644 --- a/source3/smbd/vfs.c +++ b/source3/smbd/vfs.c @@ -1882,11 +1882,13 @@ int smb_vfs_call_fchmod(struct vfs_handle_struct *handle, return handle->fns->fchmod_fn(handle, fsp, mode); } -int smb_vfs_call_chown(struct vfs_handle_struct *handle, const char *path, - uid_t uid, gid_t gid) +int smb_vfs_call_chown(struct vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + uid_t uid, + gid_t gid) { VFS_FIND(chown); - return handle->fns->chown_fn(handle, path, uid, gid); + return handle->fns->chown_fn(handle, smb_fname, uid, gid); } int smb_vfs_call_fchown(struct vfs_handle_struct *handle, @@ -1983,7 +1985,7 @@ NTSTATUS vfs_chown_fsp(files_struct *fsp, uid_t uid, gid_t gid) uid, gid); } else { ret = SMB_VFS_CHOWN(fsp->conn, - path, + fsp->fsp_name, uid, gid); } diff --git a/source3/torture/cmd_vfs.c b/source3/torture/cmd_vfs.c index a7e70b3c3a1..4bd5417fb8a 100644 --- a/source3/torture/cmd_vfs.c +++ b/source3/torture/cmd_vfs.c @@ -955,6 +955,7 @@ static NTSTATUS cmd_fchmod_acl(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int a static NTSTATUS cmd_chown(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv) { + struct smb_filename *smb_fname = NULL; uid_t uid; gid_t gid; if (argc != 4) { @@ -964,7 +965,16 @@ static NTSTATUS cmd_chown(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, uid = atoi(argv[2]); gid = atoi(argv[3]); - if (SMB_VFS_CHOWN(vfs->conn, argv[1], uid, gid) == -1) { + + smb_fname = synthetic_smb_fname(talloc_tos(), + argv[1], + NULL, + NULL); + if (smb_fname == NULL) { + return NT_STATUS_NO_MEMORY; + } + + if (SMB_VFS_CHOWN(vfs->conn, smb_fname, uid, gid) == -1) { printf("chown: error=%d (%s)\n", errno, strerror(errno)); return NT_STATUS_UNSUCCESSFUL; } |