[SCM] Samba Shared Repository - branch master updated

Michael Adam obnox at samba.org
Mon May 30 10:54:03 MDT 2011


The branch, master has been updated
       via  723ba60 s3:net: registry export: close key after recursion returns
       via  0d746f6 s3:net registry: polish output of net registry enumerate[_recursive]
       via  5ec479f s3:net: registry: use recursive implementation for enumerate
       via  22011dd s3:net: registry: add new command enumerate_recursive
       via  de10847 s4:torture: fix SEGFAULT in raw.acl.dynamic
       via  817c64f nfs4_acls: pass ACE_FLAG_INHERITED_ACE down from the client
       via  b047130 nfs4_acls: pass ACE_FLAG_INHERITED_ACE up to the client
       via  c967e8f s3:smbcacls: fix parsing of multiple flags
      from  508e160 s3: fix some -Wunused-but-set-variable build warnings.

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


- Log -----------------------------------------------------------------
commit 723ba6024c4821a8902dba0248dfab70f56a8203
Author: Gregor Beck <gbeck at sernet.de>
Date:   Mon May 30 09:31:21 2011 +0200

    s3:net: registry export: close key after recursion returns
    
    Signed-off-by: Michael Adam <obnox at samba.org>
    
    Autobuild-User: Michael Adam <obnox at samba.org>
    Autobuild-Date: Mon May 30 18:53:28 CEST 2011 on sn-devel-104

commit 0d746f653e76de52985d543a15fd6ee3bf2f4823
Author: Michael Adam <obnox at samba.org>
Date:   Mon May 30 16:54:47 2011 +0200

    s3:net registry: polish output of net registry enumerate[_recursive]
    
    so that net registry enumerate output is as before, and
    net registry enumerate_recursive is formatted more nicely

commit 5ec479fa0c9db4072541d46345164542d037cfc9
Author: Gregor Beck <gbeck at sernet.de>
Date:   Mon May 30 10:24:16 2011 +0200

    s3:net: registry: use recursive implementation for enumerate
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit 22011ddc9e72c8a201e3ca6e01745a68738d5916
Author: Gregor Beck <gbeck at sernet.de>
Date:   Mon May 30 08:58:34 2011 +0200

    s3:net: registry: add new command enumerate_recursive
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit de10847973faed53ac078edb55ded0fb99329487
Author: Gregor Beck <gbeck at sernet.de>
Date:   Thu May 26 10:23:41 2011 +0200

    s4:torture: fix SEGFAULT in raw.acl.dynamic
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit 817c64f5de65c6ba7cc535446279f769d6552618
Author: Gregor Beck <gbeck at sernet.de>
Date:   Mon May 23 14:45:57 2011 +0200

    nfs4_acls: pass ACE_FLAG_INHERITED_ACE down from the client
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit b0471303ba50caab7da5f50e6f7d8c4b1c664238
Author: Gregor Beck <gbeck at sernet.de>
Date:   Mon May 23 14:27:11 2011 +0200

    nfs4_acls: pass ACE_FLAG_INHERITED_ACE up to the client
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit c967e8fae5babf6e337c0e2b85fc42eccfe9e4c4
Author: Gregor Beck <gbeck at sernet.de>
Date:   Thu May 26 10:15:56 2011 +0200

    s3:smbcacls: fix parsing of multiple flags
    
    Signed-off-by: Michael Adam <obnox at samba.org>

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

Summary of changes:
 source3/modules/nfs4_acls.c  |    6 ++
 source3/modules/nfs4_acls.h  |    3 +-
 source3/utils/net_registry.c |  139 ++++++++++++++++++++++++++++++++++-------
 source3/utils/smbcacls.c     |    7 ++-
 source4/torture/raw/acls.c   |   15 +++--
 5 files changed, 137 insertions(+), 33 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/modules/nfs4_acls.c b/source3/modules/nfs4_acls.c
index c841d83..7303d0b 100644
--- a/source3/modules/nfs4_acls.c
+++ b/source3/modules/nfs4_acls.c
@@ -272,6 +272,9 @@ static bool smbacl4_nfs42win(TALLOC_CTX *mem_ctx, SMB4ACL_T *theacl, /* in */
 		}
 
 		mapped_ace_flags = ace->aceFlags & 0xf;
+		if (ace->aceFlags & SMB_ACE4_INHERITED_ACE) {
+			mapped_ace_flags |= SEC_ACE_FLAG_INHERITED_ACE;
+		}
 		if (!is_directory && (mapped_ace_flags & (SMB_ACE4_FILE_INHERIT_ACE|SMB_ACE4_DIRECTORY_INHERIT_ACE))) {
 			/*
 			 * GPFS sets inherits dir_inhert and file_inherit flags
@@ -564,6 +567,9 @@ static bool smbacl4_fill_ace4(
 	memset(ace_v4, 0, sizeof(SMB_ACE4PROP_T));
 	ace_v4->aceType = ace_nt->type; /* only ACCESS|DENY supported right now */
 	ace_v4->aceFlags = ace_nt->flags & SEC_ACE_FLAG_VALID_INHERIT;
+	if (ace_nt->flags & SEC_ACE_FLAG_INHERITED_ACE) {
+		ace_v4->aceFlags |= SMB_ACE4_INHERITED_ACE;
+	}
 	ace_v4->aceMask = ace_nt->access_mask &
 		(SEC_STD_ALL | SEC_FILE_ALL);
 
diff --git a/source3/modules/nfs4_acls.h b/source3/modules/nfs4_acls.h
index f4576b0..fcab635 100644
--- a/source3/modules/nfs4_acls.h
+++ b/source3/modules/nfs4_acls.h
@@ -76,9 +76,10 @@ typedef struct _SMB_ACE4PROP_T {
 #define SMB_ACE4_SUCCESSFUL_ACCESS_ACE_FLAG   0x00000010
 #define SMB_ACE4_FAILED_ACCESS_ACE_FLAG       0x00000020
 #define SMB_ACE4_IDENTIFIER_GROUP             0x00000040
+#define SMB_ACE4_INHERITED_ACE                0x00000080
 #define SMB_ACE4_ALL_FLAGS	( SMB_ACE4_FILE_INHERIT_ACE | SMB_ACE4_DIRECTORY_INHERIT_ACE \
 | SMB_ACE4_NO_PROPAGATE_INHERIT_ACE | SMB_ACE4_INHERIT_ONLY_ACE | SMB_ACE4_SUCCESSFUL_ACCESS_ACE_FLAG \
-| SMB_ACE4_FAILED_ACCESS_ACE_FLAG | SMB_ACE4_IDENTIFIER_GROUP )
+| SMB_ACE4_FAILED_ACCESS_ACE_FLAG | SMB_ACE4_IDENTIFIER_GROUP | SMB_ACE4_INHERITED_ACE)
 
 	uint32	aceMask;	/* Access rights */
 /*The bitmask constants used for the access mask field are as follows: */
diff --git a/source3/utils/net_registry.c b/source3/utils/net_registry.c
index 19405e2..ab8fb4e 100644
--- a/source3/utils/net_registry.c
+++ b/source3/utils/net_registry.c
@@ -122,23 +122,88 @@ done:
 	return werr;
 }
 
+static WERROR registry_enumkey(struct registry_key* parent, const char* keyname, bool recursive)
+{
+	WERROR werr;
+	TALLOC_CTX *ctx = talloc_stackframe();
+	char*  subkey_name;
+	NTTIME modtime;
+	uint32_t count;
+	char* valname = NULL;
+	struct registry_value *valvalue = NULL;
+	struct registry_key* key = NULL;
+
+	werr = reg_openkey(ctx, parent, keyname, REG_KEY_READ, &key);
+	if (!W_ERROR_IS_OK(werr)) {
+		goto done;
+	}
+
+	if (recursive) {
+		printf("[%s]\n\n", key->key->name);
+	} else {
+		for (count = 0;
+		     werr = reg_enumkey(ctx, key, count, &subkey_name, &modtime),
+		     W_ERROR_IS_OK(werr);
+		     count++)
+		{
+			print_registry_key(subkey_name, &modtime);
+		}
+		if (!W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, werr)) {
+			goto done;
+		}
+	}
+
+	for (count = 0;
+	     werr = reg_enumvalue(ctx, key, count, &valname, &valvalue),
+	     W_ERROR_IS_OK(werr);
+	     count++)
+	{
+		print_registry_value_with_name(valname, valvalue);
+	}
+	if (!W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, werr)) {
+		goto done;
+	}
+
+	if (!recursive) {
+		werr = WERR_OK;
+		goto done;
+	}
+
+	for (count = 0;
+	     werr = reg_enumkey(ctx, key, count, &subkey_name, &modtime),
+	     W_ERROR_IS_OK(werr);
+	     count++)
+	{
+		werr = registry_enumkey(key, subkey_name, recursive);
+		if (!W_ERROR_IS_OK(werr)) {
+			goto done;
+		}
+	}
+	if (!W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, werr)) {
+		goto done;
+	}
+
+	werr = WERR_OK;
+
+done:
+	TALLOC_FREE(ctx);
+	return werr;
+}
+
+
+
 /*
  *
  * the main "net registry" function implementations
  *
  */
-
 static int net_registry_enumerate(struct net_context *c, int argc,
 				  const char **argv)
 {
 	WERROR werr;
 	struct registry_key *key = NULL;
+	char* name = NULL;
 	TALLOC_CTX *ctx = talloc_stackframe();
-	char *subkey_name;
-	NTTIME modtime;
-	uint32_t count;
-	char *valname = NULL;
-	struct registry_value *valvalue = NULL;
 	int ret = -1;
 
 	if (argc != 1 || c->display_usage) {
@@ -151,40 +216,56 @@ static int net_registry_enumerate(struct net_context *c, int argc,
 		goto done;
 	}
 
-	werr = open_key(ctx, argv[0], REG_KEY_READ, &key);
+	werr = open_hive(ctx, argv[0], REG_KEY_READ, &key, &name);
 	if (!W_ERROR_IS_OK(werr)) {
 		d_fprintf(stderr, _("open_key failed: %s\n"), win_errstr(werr));
 		goto done;
 	}
 
-	for (count = 0;
-	     werr = reg_enumkey(ctx, key, count, &subkey_name, &modtime),
-	     W_ERROR_IS_OK(werr);
-	     count++)
-	{
-		print_registry_key(subkey_name, &modtime);
+	werr = registry_enumkey(key, name, c->opt_reboot);
+	if (W_ERROR_IS_OK(werr)) {
+		ret = 0;
 	}
-	if (!W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, werr)) {
+done:
+	TALLOC_FREE(ctx);
+	return ret;
+}
+
+static int net_registry_enumerate_recursive(struct net_context *c, int argc,
+					    const char **argv)
+{
+	WERROR werr;
+	struct registry_key *key = NULL;
+	char* name = NULL;
+	TALLOC_CTX *ctx = talloc_stackframe();
+	int ret = -1;
+
+	if (argc != 1 || c->display_usage) {
+		d_printf("%s\n%s",
+			 _("Usage:"),
+			 _("net registry enumerate <path>\n"));
+		d_printf("%s\n%s",
+			 _("Example:"),
+			 _("net registry enumerate 'HKLM\\Software\\Samba'\n"));
 		goto done;
 	}
 
-	for (count = 0;
-	     werr = reg_enumvalue(ctx, key, count, &valname, &valvalue),
-	     W_ERROR_IS_OK(werr);
-	     count++)
-	{
-		print_registry_value_with_name(valname, valvalue);
-	}
-	if (!W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, werr)) {
+	werr = open_hive(ctx, argv[0], REG_KEY_READ, &key, &name);
+	if (!W_ERROR_IS_OK(werr)) {
+		d_fprintf(stderr, _("open_key failed: %s\n"), win_errstr(werr));
 		goto done;
 	}
 
-	ret = 0;
+	werr = registry_enumkey(key, name, true);
+	if (W_ERROR_IS_OK(werr)) {
+		ret = 0;
+	}
 done:
 	TALLOC_FREE(ctx);
 	return ret;
 }
 
+
 static int net_registry_createkey(struct net_context *c, int argc,
 				  const char **argv)
 {
@@ -1019,7 +1100,6 @@ static int registry_export(TALLOC_CTX *ctx, /*const*/ struct registry_key* key,
 	struct registry_value *valvalue = NULL;
 	char *valname = NULL;
 
-	struct registry_key* subkey = NULL;
 	char *subkey_name = NULL;
 	NTTIME modtime = 0;
 
@@ -1045,6 +1125,8 @@ static int registry_export(TALLOC_CTX *ctx, /*const*/ struct registry_key* key,
 		     W_ERROR_IS_OK(werr);
 	     count++)
 	{
+		struct registry_key* subkey = NULL;
+
 		werr = reg_openkey(ctx, key, subkey_name, REG_KEY_READ,
 				   &subkey);
 		if (!W_ERROR_IS_OK(werr)) {
@@ -1054,6 +1136,7 @@ static int registry_export(TALLOC_CTX *ctx, /*const*/ struct registry_key* key,
 		}
 
 		registry_export(ctx, subkey, f);
+		TALLOC_FREE(subkey);
 	}
 	if (!W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, werr)) {
 		d_fprintf(stderr, _("reg_enumkey failed: %s\n"),
@@ -1174,6 +1257,14 @@ int net_registry(struct net_context *c, int argc, const char **argv)
 			   "    Enumerate registry keys and values")
 		},
 		{
+			"enumerate_recursive",
+			net_registry_enumerate_recursive,
+			NET_TRANSPORT_LOCAL,
+			N_("Enumerate registry keys and values"),
+			N_("net registry enumerate_recursive\n"
+			   "    Enumerate registry keys and values")
+		},
+		{
 			"createkey",
 			net_registry_createkey,
 			NET_TRANSPORT_LOCAL,
diff --git a/source3/utils/smbcacls.c b/source3/utils/smbcacls.c
index 2fd9a53..1d5789d 100644
--- a/source3/utils/smbcacls.c
+++ b/source3/utils/smbcacls.c
@@ -360,7 +360,12 @@ static bool parse_ace_flags(const char *str, unsigned int *pflags)
 			return false;
 		}
 
-		if (*p != '|' && *p != '\0') {
+		switch (*p) {
+		case '|':
+			p++;
+		case '\0':
+			continue;
+		default:
 			return false;
 		}
 	}
diff --git a/source4/torture/raw/acls.c b/source4/torture/raw/acls.c
index 53de4e3..01ee8be 100644
--- a/source4/torture/raw/acls.c
+++ b/source4/torture/raw/acls.c
@@ -2203,13 +2203,14 @@ static bool test_inheritance_dynamic(struct torture_context *tctx,
 	smbcli_unlink(cli->tree, fname1);
 
 done:
-	torture_comment(tctx, "put back original sd\n");
-	set.set_secdesc.level = RAW_SFILEINFO_SEC_DESC;
-	set.set_secdesc.in.file.fnum = fnum;
-	set.set_secdesc.in.secinfo_flags = SECINFO_DACL;
-	set.set_secdesc.in.sd = sd_orig;
-	status = smb_raw_setfileinfo(cli->tree, &set);
-
+	if (sd_orig != NULL) {
+		torture_comment(tctx, "put back original sd\n");
+		set.set_secdesc.level = RAW_SFILEINFO_SEC_DESC;
+		set.set_secdesc.in.file.fnum = fnum;
+		set.set_secdesc.in.secinfo_flags = SECINFO_DACL;
+		set.set_secdesc.in.sd = sd_orig;
+		status = smb_raw_setfileinfo(cli->tree, &set);
+	}
 	smbcli_close(cli->tree, fnum);
 	smbcli_rmdir(cli->tree, dname);
 	smb_raw_exit(cli->session);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list