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 <[email protected]>
Date:   Mon May 30 09:31:21 2011 +0200

    s3:net: registry export: close key after recursion returns
    
    Signed-off-by: Michael Adam <[email protected]>
    
    Autobuild-User: Michael Adam <[email protected]>
    Autobuild-Date: Mon May 30 18:53:28 CEST 2011 on sn-devel-104

commit 0d746f653e76de52985d543a15fd6ee3bf2f4823
Author: Michael Adam <[email protected]>
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 <[email protected]>
Date:   Mon May 30 10:24:16 2011 +0200

    s3:net: registry: use recursive implementation for enumerate
    
    Signed-off-by: Michael Adam <[email protected]>

commit 22011ddc9e72c8a201e3ca6e01745a68738d5916
Author: Gregor Beck <[email protected]>
Date:   Mon May 30 08:58:34 2011 +0200

    s3:net: registry: add new command enumerate_recursive
    
    Signed-off-by: Michael Adam <[email protected]>

commit de10847973faed53ac078edb55ded0fb99329487
Author: Gregor Beck <[email protected]>
Date:   Thu May 26 10:23:41 2011 +0200

    s4:torture: fix SEGFAULT in raw.acl.dynamic
    
    Signed-off-by: Michael Adam <[email protected]>

commit 817c64f5de65c6ba7cc535446279f769d6552618
Author: Gregor Beck <[email protected]>
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 <[email protected]>

commit b0471303ba50caab7da5f50e6f7d8c4b1c664238
Author: Gregor Beck <[email protected]>
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 <[email protected]>

commit c967e8fae5babf6e337c0e2b85fc42eccfe9e4c4
Author: Gregor Beck <[email protected]>
Date:   Thu May 26 10:15:56 2011 +0200

    s3:smbcacls: fix parsing of multiple flags
    
    Signed-off-by: Michael Adam <[email protected]>

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

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

Reply via email to