summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTim Prouty <tprouty@samba.org>2009-01-08 17:21:08 -0800
committerKarolin Seeger <kseeger@samba.org>2009-01-28 09:40:06 +0100
commit1a812bee2208970deb450e8de2487278ab709d06 (patch)
treec55ce14180a89ce48657c0a788ecfd5902095ded /source
parent3ab393efc9be444de6f4fda5b08a6f8aa3a03af1 (diff)
downloadsamba-1a812bee2208970deb450e8de2487278ab709d06.tar.gz
s3: Remove a few unnecessary checks from the streams depot module and fix to work with NTRENAME
Handling of error codes when renaming a file to a stream and a stream to a file is now done in rename_internals_fsp. The NTRENAME stream path only passes in the stream name, so the new base can now be different from the old base. (cherry picked from commit 2cca28b3e999a8886539b9a5dde267bb8a3a1db7)
Diffstat (limited to 'source')
-rw-r--r--source/modules/vfs_streams_depot.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/source/modules/vfs_streams_depot.c b/source/modules/vfs_streams_depot.c
index f66a06b7de6..7f46f774493 100644
--- a/source/modules/vfs_streams_depot.c
+++ b/source/modules/vfs_streams_depot.c
@@ -525,6 +525,7 @@ static int streams_depot_rename(vfs_handle_struct *handle,
char *nsname = NULL;
char *ostream_fname = NULL;
char *nstream_fname = NULL;
+ char *newname_full = NULL;
DEBUG(10, ("streams_depot_rename called for %s => %s\n",
oldname, newname));
@@ -536,11 +537,6 @@ static int streams_depot_rename(vfs_handle_struct *handle,
return SMB_VFS_NEXT_RENAME(handle, oldname, newname);
}
- if (!(old_is_stream && new_is_stream)) {
- errno = ENOSYS;
- return -1;
- }
-
frame = talloc_stackframe();
if (!NT_STATUS_IS_OK(split_ntfs_stream_name(talloc_tos(), oldname,
@@ -549,7 +545,7 @@ static int streams_depot_rename(vfs_handle_struct *handle,
goto done;
}
- if (!NT_STATUS_IS_OK(split_ntfs_stream_name(talloc_tos(), oldname,
+ if (!NT_STATUS_IS_OK(split_ntfs_stream_name(talloc_tos(), newname,
&nbase, &nsname))) {
errno = ENOMEM;
goto done;
@@ -561,17 +557,27 @@ static int streams_depot_rename(vfs_handle_struct *handle,
goto done;
}
- if (StrCaseCmp(obase, nbase) != 0) {
- errno = ENOSYS;
- goto done;
- }
-
ostream_fname = stream_name(handle, oldname, false);
if (ostream_fname == NULL) {
return -1;
}
- nstream_fname = stream_name(handle, newname, false);
+ /*
+ * Handle passing in a stream name without the base file. This is
+ * exercised by the NTRENAME streams rename path.
+ */
+ if (StrCaseCmp(nbase, "./") == 0) {
+ newname_full = talloc_asprintf(talloc_tos(), "%s:%s", obase,
+ nsname);
+ if (newname_full == NULL) {
+ errno = ENOMEM;
+ goto done;
+ }
+ }
+
+ nstream_fname = stream_name(handle,
+ newname_full ? newname_full : newname,
+ false);
if (nstream_fname == NULL) {
return -1;
}