[SCM] Samba Shared Repository - branch v4-3-test updated

Karolin Seeger kseeger at samba.org
Tue Jan 26 11:59:06 UTC 2016


The branch, v4-3-test has been updated
       via  756b452 s3-parm: clean up defaults when removing global parameters
       via  54c0fce s4:torture: add SMB2 test for directory creation initial allocation size
       via  57654ee s3:smbd: Ignore initial allocation size for directory creation
      from  6d82bdd smbcacls: fix uninitialized variable

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-3-test


- Log -----------------------------------------------------------------
commit 756b4525d7cb623eebf1d74447d946ca7781a79b
Author: Alexander Bokovoy <ab at samba.org>
Date:   Fri Jan 22 11:44:03 2016 +0200

    s3-parm: clean up defaults when removing global parameters
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11693
    
    When globals are re-initialized, they are cleared and globals' talloc
    context is freed. However, parm_table still contains a reference to the
    global value in the defaults. This confuses lpcfg_string_free() after
    commit 795c543d858b2452f062a02846c2f908fe4cffe4 because it tries to
    free already freed pointer which is passed by lp_save_defaults():
    
    ....
        case P_STRING:
        case P_USTRING:
                      lpcfg_string_set(Globals.ctx,
                                       &parm_table[i].def.svalue,
                                       *(char **)lp_parm_ptr(NULL, &parm_table[i]));
    ....
    
    here &parm_table[i].def.svalue is passed to lpcfg_string_free() but it
    is a pointer to a value allocated with previous Globals.ctx which
    already was freed.
    
    This specifically affects registry backend of smb.conf in lp_load_ex()
    where init_globals() called explicitly to re-init globals after
    lp_save_defaults() if we have registry backend defined.
    
    Reviewed-by: Uri Simchoni <uri at samba.org>
    Signed-off-by: Alexander Bokovoy <ab at samba.org>
    
    Autobuild-User(master): Uri Simchoni <uri at samba.org>
    Autobuild-Date(master): Mon Jan 25 23:58:42 CET 2016 on sn-devel-144
    
    (cherry picked from commit 500bc01478881cab89f0e691427e34a405bb0003)
    
    Autobuild-User(v4-3-test): Karolin Seeger <kseeger at samba.org>
    Autobuild-Date(v4-3-test): Tue Jan 26 12:58:53 CET 2016 on sn-devel-104

commit 54c0fce1be832427c9a7c3c0ba170a52e2356ec1
Author: Ralph Boehme <slow at 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 <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Ralph Böhme <slow at samba.org>
    Autobuild-Date(master): Sun Jan 24 01:20:52 CET 2016 on sn-devel-144
    
    (cherry picked from commit cd86f20e245cc1b0cb3be5d6cb1b45c45e2a45a8)

commit 57654eefe041e3eeb3bdad9084aea194f2eb3777
Author: Ralph Boehme <slow at 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 <vl at samba.org>
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    (cherry picked from commit 78ccbb07170c3e49a084d31434310f973e3d6158)

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

Summary of changes:
 source3/param/loadparm.c      | 17 ++++++++++++
 source3/smbd/open.c           | 10 ++-----
 source4/torture/smb2/create.c | 64 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 84 insertions(+), 7 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
index aee7ed7..7fd1c0d 100644
--- a/source3/param/loadparm.c
+++ b/source3/param/loadparm.c
@@ -403,8 +403,25 @@ static void free_parameters_by_snum(int snum)
  */
 static void free_global_parameters(void)
 {
+	uint32_t i;
+	struct parm_struct *parm;
+
 	free_param_opts(&Globals.param_opt);
 	free_parameters_by_snum(GLOBAL_SECTION_SNUM);
+
+	/* Reset references in the defaults because the context is going to be freed */
+	for (i=0; parm_table[i].label; i++) {
+		parm = &parm_table[i];
+		if ((parm->type == P_STRING) ||
+		    (parm->type == P_USTRING)) {
+			if ((parm->def.svalue != NULL) &&
+			    (*(parm->def.svalue) != '\0')) {
+				if (talloc_parent(parm->def.svalue) == Globals.ctx) {
+					parm->def.svalue = NULL;
+				}
+			}
+		}
+	}
 	TALLOC_FREE(Globals.ctx);
 }
 
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 154c1a9..530c573 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -4706,15 +4706,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



More information about the samba-cvs mailing list