s3: Remove a few unnecessary checks from the streams depot module and fix to work...
authorTim Prouty <tprouty@samba.org>
Fri, 9 Jan 2009 01:21:08 +0000 (17:21 -0800)
committerJeremy Allison <jra@samba.org>
Fri, 9 Jan 2009 01:21:08 +0000 (17:21 -0800)
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.

source/modules/vfs_streams_depot.c

index d543ea362dd5ecf9f4149ba2e0ff2e5afcf5d8aa..8ff617cba18250f8391979f44b48a99d751d6393 100644 (file)
@@ -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;
        }