r20372: Make NTrename the same as SMBmv w.r.t. wildcards.
authorJeremy Allison <jra@samba.org>
Thu, 28 Dec 2006 00:24:34 +0000 (00:24 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:16:45 +0000 (12:16 -0500)
Jeremy.

source/smbd/nttrans.c

index 68c5b4618934fd0ecd7a33fde19fea113df5aeb8..6359f931c019a009aaf188bf566a84c8c17e0be1 100644 (file)
@@ -1724,14 +1724,15 @@ int reply_ntrename(connection_struct *conn,
        pstring newname;
        char *p;
        NTSTATUS status;
-       BOOL path_contains_wcard = False;
+       BOOL path1_contains_wcard = False;
+       BOOL path2_contains_wcard = False;
        uint32 attrs = SVAL(inbuf,smb_vwv0);
        uint16 rename_type = SVAL(inbuf,smb_vwv1);
 
        START_PROFILE(SMBntrename);
 
        p = smb_buf(inbuf) + 1;
-       p += srvstr_get_path_wcard(inbuf, oldname, p, sizeof(oldname), 0, STR_TERMINATE, &status, &path_contains_wcard);
+       p += srvstr_get_path_wcard(inbuf, oldname, p, sizeof(oldname), 0, STR_TERMINATE, &status, &path1_contains_wcard);
        if (!NT_STATUS_IS_OK(status)) {
                END_PROFILE(SMBntrename);
                return ERROR_NT(status);
@@ -1749,7 +1750,7 @@ int reply_ntrename(connection_struct *conn,
        }
 
        p++;
-       p += srvstr_get_path(inbuf, newname, p, sizeof(newname), 0, STR_TERMINATE, &status);
+       p += srvstr_get_path_wcard(inbuf, newname, p, sizeof(newname), 0, STR_TERMINATE, &status, &path2_contains_wcard);
        if (!NT_STATUS_IS_OK(status)) {
                END_PROFILE(SMBntrename);
                return ERROR_NT(status);
@@ -1762,13 +1763,18 @@ int reply_ntrename(connection_struct *conn,
        
        switch(rename_type) {
                case RENAME_FLAG_RENAME:
-                       status = rename_internals(conn, oldname, newname, attrs, False, path_contains_wcard);
+                       status = rename_internals(conn, oldname, newname, attrs, False, path1_contains_wcard);
                        break;
                case RENAME_FLAG_HARD_LINK:
-                       status = hardlink_internals(conn, oldname, newname);
+                       if (path1_contains_wcard || path2_contains_wcard) {
+                               /* No wildcards. */
+                               status = NT_STATUS_OBJECT_PATH_SYNTAX_BAD;
+                       } else {
+                               status = hardlink_internals(conn, oldname, newname);
+                       }
                        break;
                case RENAME_FLAG_COPY:
-                       if (path_contains_wcard) {
+                       if (path1_contains_wcard || path2_contains_wcard) {
                                /* No wildcards. */
                                status = NT_STATUS_OBJECT_PATH_SYNTAX_BAD;
                        } else {