s3: VFS: vfs_ceph_snapshots: Make setxattr return errno = EROFS on a shadow copy...
authorJeremy Allison <jra@samba.org>
Thu, 8 Aug 2019 22:59:15 +0000 (15:59 -0700)
committerJeremy Allison <jra@samba.org>
Fri, 9 Aug 2019 18:08:03 +0000 (18:08 +0000)
smbd has no business modifying a shadow copy filesystem, it should be read-only.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: David Disseldorp <ddiss@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Fri Aug  9 18:08:03 UTC 2019 on sn-devel-184

source3/modules/vfs_ceph_snapshots.c

index a528dbcaaeb727e8445c39b73af09dee9cd2cff8..a70a6adb1f4a41b58ea9ff10dff4eb7e949fb52e 100644 (file)
@@ -1452,42 +1452,21 @@ static int ceph_snap_gmt_setxattr(struct vfs_handle_struct *handle,
                                size_t size, int flags)
 {
        time_t timestamp = 0;
-       char stripped[PATH_MAX + 1];
-       char conv[PATH_MAX + 1];
        int ret;
-       struct smb_filename *new_fname;
-       int saved_errno;
 
        ret = ceph_snap_gmt_strip_snapshot(handle,
                                        csmb_fname->base_name,
-                                       &timestamp, stripped, sizeof(stripped));
-       if (ret < 0) {
-               errno = -ret;
-               return -1;
-       }
-       if (timestamp == 0) {
-               return SMB_VFS_NEXT_SETXATTR(handle, csmb_fname,
-                                       aname, value, size, flags);
-       }
-       ret = ceph_snap_gmt_convert(handle, stripped,
-                                       timestamp, conv, sizeof(conv));
+                                       &timestamp, NULL, 0);
        if (ret < 0) {
                errno = -ret;
                return -1;
        }
-       new_fname = cp_smb_filename(talloc_tos(), csmb_fname);
-       if (new_fname == NULL) {
-               errno = ENOMEM;
+       if (timestamp != 0) {
+               errno = EROFS;
                return -1;
        }
-       new_fname->base_name = conv;
-
-       ret = SMB_VFS_NEXT_SETXATTR(handle, new_fname,
+       return SMB_VFS_NEXT_SETXATTR(handle, csmb_fname,
                                aname, value, size, flags);
-       saved_errno = errno;
-       TALLOC_FREE(new_fname);
-       errno = saved_errno;
-       return ret;
 }
 
 static int ceph_snap_gmt_get_real_filename(struct vfs_handle_struct *handle,