The branch, master has been updated
       via  cd86f20 s4:torture: add SMB2 test for directory creation initial 
allocation size
       via  78ccbb0 s3:smbd: Ignore initial allocation size for directory 
creation
      from  a1a8746 s3:smb2_sesssetup: implement SMB3 session bind (disabled)

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit cd86f20e245cc1b0cb3be5d6cb1b45c45e2a45a8
Author: Ralph Boehme <s...@samba.org>
Date:   Wed Jan 20 17:46:38 2016 +0100

    s4:torture: add SMB2 test for directory creation initial allocation size
    
    Test that directory creation with an initial allocation size > 0
    succeeds.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=11684
    
    Signed-off-by: Ralph Boehme <s...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>
    
    Autobuild-User(master): Ralph Böhme <s...@samba.org>
    Autobuild-Date(master): Sun Jan 24 01:20:52 CET 2016 on sn-devel-144

commit 78ccbb07170c3e49a084d31434310f973e3d6158
Author: Ralph Boehme <s...@samba.org>
Date:   Wed Nov 25 15:23:26 2015 +0100

    s3:smbd: Ignore initial allocation size for directory creation
    
    We reject directory creation with an initial allocation size > 0 with
    NT_STATUS_ACCESS_DENIED. Windows servers ignore the initial allocation
    size on directories.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=11684
    
    Pair-Programmed-With: Volker Lendecke <v...@samba.org>
    Signed-off-by: Ralph Boehme <s...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/smbd/open.c           | 10 ++-----
 source4/torture/smb2/create.c | 64 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 67 insertions(+), 7 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 3c0a7a3..ed0594b 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -4708,15 +4708,11 @@ static NTSTATUS create_file_unixpath(connection_struct 
*conn,
 
        /* Save the requested allocation size. */
        if ((info == FILE_WAS_CREATED) || (info == FILE_WAS_OVERWRITTEN)) {
-               if (allocation_size
-                   && (allocation_size > fsp->fsp_name->st.st_ex_size)) {
+               if ((allocation_size > fsp->fsp_name->st.st_ex_size)
+                   && !(fsp->is_directory))
+               {
                        fsp->initial_allocation_size = smb_roundup(
                                fsp->conn, allocation_size);
-                       if (fsp->is_directory) {
-                               /* Can't set allocation size on a directory. */
-                               status = NT_STATUS_ACCESS_DENIED;
-                               goto fail;
-                       }
                        if (vfs_allocate_file_space(
                                    fsp, fsp->initial_allocation_size) == -1) {
                                status = NT_STATUS_DISK_FULL;
diff --git a/source4/torture/smb2/create.c b/source4/torture/smb2/create.c
index 68dbbc1..1275aa8 100644
--- a/source4/torture/smb2/create.c
+++ b/source4/torture/smb2/create.c
@@ -1666,6 +1666,69 @@ done:
        return ret;
 }
 
+/*
+  test directory creation with an initial allocation size > 0
+*/
+static bool test_dir_alloc_size(struct torture_context *tctx,
+                               struct smb2_tree *tree)
+{
+       bool ret = true;
+       const char *dname = DNAME "\\torture_alloc_size.dir";
+       NTSTATUS status;
+       struct smb2_create c;
+       struct smb2_handle h1 = {{0}}, h2;
+
+       torture_comment(tctx, "Checking initial allocation size on 
directories\n");
+
+       smb2_deltree(tree, dname);
+
+       status = torture_smb2_testdir(tree, DNAME, &h1);
+       torture_assert_ntstatus_ok_goto(tctx, status, ret, done, 
"torture_smb2_testdir failed");
+
+       ZERO_STRUCT(c);
+       c.in.create_disposition = NTCREATEX_DISP_CREATE;
+       c.in.desired_access = SEC_FLAG_MAXIMUM_ALLOWED;
+       c.in.file_attributes = FILE_ATTRIBUTE_DIRECTORY;
+       c.in.share_access = NTCREATEX_SHARE_ACCESS_NONE;
+       c.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;
+       c.in.fname = dname;
+       /*
+        * An insanely large value so we can check the value is
+        * ignored: Samba either returns 0 (current behaviour), or,
+        * once vfswrap_get_alloc_size() is fixed to allow retrieving
+        * the allocated size for directories, returns
+        * smb_roundup(..., stat.st_size) which would be 1 MB by
+        * default.
+        *
+        * Windows returns 0 for emtpy directories, once directories
+        * have a few entries it starts replying with values > 0.
+        */
+       c.in.alloc_size = 1024*1024*1024;
+
+       status = smb2_create(tree, tctx, &c);
+       h2 = c.out.file.handle;
+       torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
+                                       "dir create with initial alloc size 
failed");
+
+       smb2_util_close(tree, h2);
+
+       torture_comment(tctx, "Got directory alloc size: %ju\n", 
(uintmax_t)c.out.alloc_size);
+
+       /*
+        * See above for the rational for this test
+        */
+       if (c.out.alloc_size > 1024*1024) {
+               torture_fail_goto(tctx, done, talloc_asprintf(tctx, "bad alloc 
size: %ju",
+                                                             
(uintmax_t)c.out.alloc_size));
+       }
+
+done:
+       if (!smb2_util_handle_empty(h1)) {
+               smb2_util_close(tree, h1);
+       }
+       smb2_deltree(tree, DNAME);
+       return ret;
+}
 
 /*
    basic testing of SMB2 read
@@ -1686,6 +1749,7 @@ struct torture_suite *torture_smb2_create_init(void)
        torture_suite_add_1smb2_test(suite, "acldir", test_create_acl_dir);
        torture_suite_add_1smb2_test(suite, "nulldacl", test_create_null_dacl);
        torture_suite_add_1smb2_test(suite, "mkdir-dup", test_mkdir_dup);
+       torture_suite_add_1smb2_test(suite, "dir-alloc-size", 
test_dir_alloc_size);
 
        suite->description = talloc_strdup(suite, "SMB2-CREATE tests");
 


-- 
Samba Shared Repository

Reply via email to