r23500: Two changes to survive the now activated test for rename_internals_fsp:
authorVolker Lendecke <vlendec@samba.org>
Thu, 14 Jun 2007 14:45:37 +0000 (14:45 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:23:22 +0000 (12:23 -0500)
With the target being open we have to return NT_STATUS_ACCESS_DENIED and
root_fid != 0 leads to NT_STATUS_INVALID_PARAMETER
(This used to be commit b599e5b1e10bdf825b2ce53de4a6ec35726d00f6)

source3/script/tests/test_posix_s3.sh
source3/smbd/reply.c
source3/smbd/trans2.c

index 415d71fdee0d8dbd85ffc25dbbe7ef3b4473753d..3c9d8f0dc480c7edadf82a2e2575257f80e43873 100755 (executable)
@@ -31,7 +31,7 @@ raw="RAW-ACLS RAW-CHKPATH RAW-CLOSE RAW-COMPOSITE RAW-CONTEXT RAW-EAS"
 raw="$raw RAW-IOCTL RAW-LOCK RAW-MKDIR RAW-MUX RAW-NOTIFY RAW-OPEN RAW-OPLOCK"
 raw="$raw RAW-QFILEINFO RAW-QFSINFO RAW-READ RAW-RENAME RAW-SEARCH RAW-SEEK"
 raw="$raw RAW-SFILEINFO RAW-SFILEINFO-BUG RAW-STREAMS RAW-UNLINK RAW-WRITE"
-raw="$raw RAW-SAMBA3HIDE RAW-SAMBA3BADPATH"
+raw="$raw RAW-SAMBA3HIDE RAW-SAMBA3BADPATH RAW-SFILEINFO-RENAME"
 
 rpc="RPC-AUTHCONTEXT RPC-BINDSAMBA3 RPC-SAMBA3-SRVSVC RPC-SAMBA3-SHARESEC"
 rpc="$rpc RPC-UNIXINFO RPC-SAMBA3-SPOOLSS RPC-SAMBA3-WKSSVC"
index 45c4b1d1dfb4f3fe3fe927feae396cf9fe0c9e05..c20daae21b182447dba53fc1bd9c92ffb3e50222 100644 (file)
@@ -4236,10 +4236,11 @@ static BOOL rename_path_prefix_equal(const char *src, const char *dest)
 
 NTSTATUS rename_internals_fsp(connection_struct *conn, files_struct *fsp, pstring newname, uint32 attrs, BOOL replace_if_exists)
 {
-       SMB_STRUCT_STAT sbuf;
+       SMB_STRUCT_STAT sbuf, sbuf1;
        pstring newname_last_component;
        NTSTATUS status = NT_STATUS_OK;
        struct share_mode_lock *lck = NULL;
+       BOOL dst_exists;
 
        ZERO_STRUCT(sbuf);
 
@@ -4307,12 +4308,22 @@ NTSTATUS rename_internals_fsp(connection_struct *conn, files_struct *fsp, pstrin
                return NT_STATUS_OK;
        }
 
-       if(!replace_if_exists && vfs_object_exist(conn, newname, NULL)) {
+       /*
+        * Have vfs_object_exist also fill sbuf1
+        */
+       dst_exists = vfs_object_exist(conn, newname, &sbuf1);
+
+       if(!replace_if_exists && dst_exists) {
                DEBUG(3,("rename_internals_fsp: dest exists doing rename %s -> %s\n",
                        fsp->fsp_name,newname));
                return NT_STATUS_OBJECT_NAME_COLLISION;
        }
 
+       if (file_find_di_first(file_id_sbuf(&sbuf1)) != NULL) {
+               DEBUG(3, ("rename_internals_fsp: Target file open\n"));
+               return NT_STATUS_ACCESS_DENIED;
+       }
+
        /* Ensure we have a valid stat struct for the source. */
        if (fsp->fh->fd != -1) {
                if (SMB_VFS_FSTAT(fsp,fsp->fh->fd,&sbuf) == -1) {
index 429fdc154d645f828aaeac5969bce99ae6a9e9d2..af6bc413d9ff60750b65ac876bb880cbacb139de 100644 (file)
@@ -4611,7 +4611,7 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn,
                                pstring fname)
 {
        BOOL overwrite;
-       /* uint32 root_fid; */  /* Not used */
+       uint32 root_fid;
        uint32 len;
        pstring newname;
        pstring base_name;
@@ -4624,10 +4624,10 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn,
        }
 
        overwrite = (CVAL(pdata,0) ? True : False);
-       /* root_fid = IVAL(pdata,4); */
+       root_fid = IVAL(pdata,4);
        len = IVAL(pdata,8);
 
-       if (len > (total_data - 12) || (len == 0)) {
+       if (len > (total_data - 12) || (len == 0) || (root_fid != 0)) {
                return NT_STATUS_INVALID_PARAMETER;
        }