diff options
author | Jeremy Allison <jra@samba.org> | 2016-03-03 11:54:23 -0800 |
---|---|---|
committer | Ralph Boehme <slow@samba.org> | 2016-03-05 09:39:18 +0100 |
commit | d1f26bc43228843f57b1ee23c1690306d6440865 (patch) | |
tree | adadda8ac77ef95fb7ff0bb7be7c7610cfab3932 /source3/modules | |
parent | 9678611d82d518bb16402a827cbf13769a5f0333 (diff) | |
download | samba-d1f26bc43228843f57b1ee23c1690306d6440865.tar.gz |
VFS: Modify chown to take a const struct smb_filename * instead of const char *
Preparing to reduce use of lp_posix_pathnames().
Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
Diffstat (limited to 'source3/modules')
-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 |
14 files changed, 187 insertions, 74 deletions
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; } |