Author: vlendec
Date: 2006-12-21 22:35:10 +0000 (Thu, 21 Dec 2006)
New Revision: 20313

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=20313

Log:
Make trans2_mkdir also go through open_directory for all the fancy inherit_acl
stuff & friends.

Survives raw-mkdir. I'll activate that tomorrow when all build farm machines
have picked up the changed samba4 torture test.

Volker

Modified:
   branches/SAMBA_3_0/source/smbd/trans2.c


Changeset:
Modified: branches/SAMBA_3_0/source/smbd/trans2.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/trans2.c     2006-12-21 22:30:21 UTC (rev 
20312)
+++ branches/SAMBA_3_0/source/smbd/trans2.c     2006-12-21 22:35:10 UTC (rev 
20313)
@@ -4773,12 +4773,12 @@
        char *params = *pparams;
        char *pdata = *ppdata;
        pstring directory;
-       int ret = -1;
        SMB_STRUCT_STAT sbuf;
        BOOL bad_path = False;
        NTSTATUS status = NT_STATUS_OK;
        TALLOC_CTX *ctx = NULL;
        struct ea_list *ea_list = NULL;
+       files_struct *fsp;
 
        if (!CAN_WRITE(conn))
                return ERROR_DOS(ERRSRV,ERRaccess);
@@ -4827,27 +4827,35 @@
                }
                ea_list = read_ea_list(ctx, pdata + 4, total_data - 4);
                if (!ea_list) {
-                       talloc_destroy(ctx);
+                       TALLOC_FREE(ctx);
                        return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
                }
        } else if (IVAL(pdata,0) != 4) {
                return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
        }
 
-       if (check_name(directory,conn)) {
-               ret = 
vfs_MkDir(conn,directory,unix_mode(conn,aDIR,directory,True));
-       }
-  
-       if(ret < 0) {
-               talloc_destroy(ctx);
+       if (!check_name(directory,conn)) {
+               TALLOC_FREE(ctx);
                DEBUG(5,("call_trans2mkdir error (%s)\n", strerror(errno)));
-               return set_bad_path_error(errno, bad_path, outbuf, 
ERRDOS,ERRnoaccess);
+               return set_bad_path_error(errno, bad_path, outbuf, ERRDOS,
+                                         ERRnoaccess);
        }
 
+       status = open_directory(conn, directory, &sbuf, 
+                               FILE_READ_ATTRIBUTES, /* A stat open */
+                               FILE_SHARE_NONE, /* Ignored  */
+                               FILE_CREATE, 0, NULL, &fsp);
+
+       if (!NT_STATUS_IS_OK(status)) {
+               TALLOC_FREE(ctx);
+               return ERROR_NT(status);
+       }
+       close_file(fsp, NORMAL_CLOSE);
+  
        /* Try and set any given EA. */
        if (ea_list) {
                status = set_ea(conn, NULL, directory, ea_list);
-               talloc_destroy(ctx);
+               TALLOC_FREE(ctx);
                if (!NT_STATUS_IS_OK(status)) {
                        return ERROR_NT(status);
                }

Reply via email to