Fix bug #6254 - PUT/GET produces an error in IPv6 to a smb-server(3.3)
authorJeremy Allison <jra@samba.org>
Fri, 10 Apr 2009 05:46:31 +0000 (22:46 -0700)
committerKarolin Seeger <kseeger@samba.org>
Fri, 17 Apr 2009 07:43:28 +0000 (09:43 +0200)
has parameter "msdfs root = yes"
This was broken by the refactoring around create_file().
MSDFS pathname processing must be done FIRST.
MSDFS pathnames containing IPv6 addresses can
be confused with NTFS stream names (they contain
":" characters.
Jeremy.
(cherry picked from commit eb29aa406f14397e3c55e559e2c02da6eb6c4cbd)

source/smbd/open.c

index 58d1f6d44688b9192b822b43d7db63944634ff94..535abcc26d61a112265f7b9dc63ad93e4dd832a8 100644 (file)
@@ -3055,6 +3055,29 @@ NTSTATUS create_file(connection_struct *conn,
                  (unsigned int)root_dir_fid,
                  ea_list, sd, fname));
 
+       /* MSDFS pathname processing must be done FIRST.
+          MSDFS pathnames containing IPv6 addresses can
+          be confused with NTFS stream names (they contain
+          ":" characters. JRA. */
+
+       if ((req != NULL) && (req->flags2 & FLAGS2_DFS_PATHNAMES)) {
+               char *resolved_fname;
+
+               status = resolve_dfspath(talloc_tos(), conn, true, fname,
+                                        &resolved_fname);
+
+               if (!NT_STATUS_IS_OK(status)) {
+                       /*
+                        * For PATH_NOT_COVERED we had
+                        * reply_botherror(req, NT_STATUS_PATH_NOT_COVERED,
+                        *                 ERRSRV, ERRbadpath);
+                        * Need to fix in callers
+                        */
+                       goto fail;
+               }
+               fname = resolved_fname;
+       }
+
        /*
         * Get the file name.
         */
@@ -3182,24 +3205,6 @@ NTSTATUS create_file(connection_struct *conn,
                }
        }
 
-       if ((req != NULL) && (req->flags2 & FLAGS2_DFS_PATHNAMES)) {
-               char *resolved_fname;
-
-               status = resolve_dfspath(talloc_tos(), conn, true, fname,
-                                        &resolved_fname);
-
-               if (!NT_STATUS_IS_OK(status)) {
-                       /*
-                        * For PATH_NOT_COVERED we had
-                        * reply_botherror(req, NT_STATUS_PATH_NOT_COVERED,
-                        *                 ERRSRV, ERRbadpath);
-                        * Need to fix in callers
-                        */
-                       goto fail;
-               }
-               fname = resolved_fname;
-       }
-
        /*
         * Check if POSIX semantics are wanted.
         */