The branch, master has been updated
       via  01db877c776 srvsvc: Move brl_get_locks() out of enum_file_fn()
       via  8e4583f730a test: Show that netfileenum is broken
       via  1d40cc01c2d rpcclient: Make netfileenum cmd print the path names
       via  8c080f28c37 rpcclient: Use struct initializers in 
cmd_srvsvc_net_file_enum()
       via  46ab1d478d8 srvsvc: Collect file ids in enum_file_fn()
       via  bda0b3875d9 srvsvc: Use a struct initializer in net_enum_files()
       via  96d68bb9f26 srvsvc: Directly use "ctr3->count" instead of "i"
       via  ff80f68c302 srvsvc: Use a struct assignment in enum_file_fn()
       via  a9397f87881 srvsvc: Introduce ctx3 helper var in enum_file_fn()
      from  7215669d297 vfs: remove root_dir_fid arg from SMB_VFS_CREATE_FILE()

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


- Log -----------------------------------------------------------------
commit 01db877c7766387984ef32914eca0b2e817c4c6a
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Apr 21 14:54:25 2020 +0200

    srvsvc: Move brl_get_locks() out of enum_file_fn()
    
    With share_infos.tdb this is a locking order violation:
    share_infos.tdb is level 4, brlock.tdb is level 2. Avoid this by first
    walking the share_infos.tdb and then fetching all the brlock entries.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14355
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Stefan Metzmacher <me...@samba.org>
    
    Autobuild-User(master): Stefan Metzmacher <me...@samba.org>
    Autobuild-Date(master): Thu May 14 22:06:32 UTC 2020 on sn-devel-184

commit 8e4583f730abd1a210ec52d5a060dddc4ad850bb
Author: Volker Lendecke <v...@samba.org>
Date:   Mon May 11 11:08:54 2020 +0200

    test: Show that netfileenum is broken
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14355
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Stefan Metzmacher <me...@samba.org>

commit 1d40cc01c2d7f14704c1d9b4b7c42c4cf3450da9
Author: Volker Lendecke <v...@samba.org>
Date:   Mon May 11 11:09:02 2020 +0200

    rpcclient: Make netfileenum cmd print the path names
    
    Needed for the next commit testing netfileenum
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14355
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Stefan Metzmacher <me...@samba.org>

commit 8c080f28c37a4ada4f3605123a357666881fa3a0
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Apr 22 13:21:40 2020 +0200

    rpcclient: Use struct initializers in cmd_srvsvc_net_file_enum()
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14355
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Stefan Metzmacher <me...@samba.org>

commit 46ab1d478d8c27bb4837bf277f8eae5d59613dd2
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Apr 21 14:32:16 2020 +0200

    srvsvc: Collect file ids in enum_file_fn()
    
    Will be used a few patches down
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14355
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Stefan Metzmacher <me...@samba.org>

commit bda0b3875d965c5cccd09dc09f593229e268ee9b
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Apr 21 14:42:50 2020 +0200

    srvsvc: Use a struct initializer in net_enum_files()
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14355
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Stefan Metzmacher <me...@samba.org>

commit 96d68bb9f26a0c99d00e92130a2f2c91c7b985e2
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Apr 21 14:24:48 2020 +0200

    srvsvc: Directly use "ctr3->count" instead of "i"
    
    To me this was not very transparent, and now that we have "ctr3" a
    single indirect looks okay
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14355
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Stefan Metzmacher <me...@samba.org>

commit ff80f68c3020be0a92eb41115a64518ece097ee7
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Apr 21 14:21:49 2020 +0200

    srvsvc: Use a struct assignment in enum_file_fn()
    
    Looks nicer than 5 complex array references...
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14355
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Stefan Metzmacher <me...@samba.org>

commit a9397f87881b9a67407b557e09478cdd40f75b75
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Apr 21 14:16:41 2020 +0200

    srvsvc: Introduce ctx3 helper var in enum_file_fn()
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14355
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Stefan Metzmacher <me...@samba.org>

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

Summary of changes:
 source3/rpc_server/srvsvc/srv_srvsvc_nt.c | 74 +++++++++++++++++++------------
 source3/rpcclient/cmd_srvsvc.c            | 29 +++++++-----
 source3/script/tests/test_netfileenum.sh  | 73 ++++++++++++++++++++++++++++++
 source3/selftest/tests.py                 |  9 ++++
 4 files changed, 145 insertions(+), 40 deletions(-)
 create mode 100755 source3/script/tests/test_netfileenum.sh


Changeset truncated at 500 lines:

diff --git a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c 
b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
index 17391424fc0..3fb8427693b 100644
--- a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
+++ b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
@@ -54,6 +54,7 @@ struct file_enum_count {
        TALLOC_CTX *ctx;
        const char *username;
        struct srvsvc_NetFileCtr3 *ctr3;
+       struct file_id *fids;
 };
 
 struct sess_file_info {
@@ -88,12 +89,9 @@ static int enum_file_fn(struct file_id id,
 {
        struct file_enum_count *fenum =
                (struct file_enum_count *)private_data;
-
+       struct srvsvc_NetFileCtr3 *ctr3 = fenum->ctr3;
        struct srvsvc_NetFileInfo3 *f;
-       int i = fenum->ctr3->count;
-       files_struct fsp;
-       struct byte_range_lock *brl;
-       int num_locks = 0;
+       struct file_id *fids = NULL;
        char *fullpath = NULL;
        uint32_t permissions;
        const char *username;
@@ -111,23 +109,25 @@ static int enum_file_fn(struct file_id id,
                return 0;
        }
 
-       f = talloc_realloc(fenum->ctx, fenum->ctr3->array,
-                                struct srvsvc_NetFileInfo3, i+1);
+       f = talloc_realloc(
+               fenum->ctx,
+               ctr3->array,
+               struct srvsvc_NetFileInfo3,
+               ctr3->count+1);
        if ( !f ) {
-               DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
+               DBG_ERR("realloc failed for %"PRIu32" items\n", ctr3->count+1);
                return 0;
        }
-       fenum->ctr3->array = f;
-
-       /* need to count the number of locks on a file */
+       ctr3->array = f;
 
-       ZERO_STRUCT( fsp );
-       fsp.file_id = id;
-
-       if ( (brl = brl_get_locks(talloc_tos(), &fsp)) != NULL ) {
-               num_locks = brl_num_locks(brl);
-               TALLOC_FREE(brl);
+       fids = talloc_realloc(
+               fenum->ctx, fenum->fids, struct file_id, ctr3->count+1);
+       if (fids == NULL) {
+               DBG_ERR("realloc failed for %"PRIu32" items\n", ctr3->count+1);
+               return 0;
        }
+       fids[ctr3->count] = id;
+       fenum->fids = fids;
 
        if ( strcmp(d->base_name, "." ) == 0 ) {
                fullpath = talloc_asprintf(
@@ -152,14 +152,15 @@ static int enum_file_fn(struct file_id id,
 
        /* now fill in the srvsvc_NetFileInfo3 struct */
 
-       fenum->ctr3->array[i].fid               =
-               (((uint32_t)(procid_to_pid(&e->pid))<<16) | e->share_file_id);
-       fenum->ctr3->array[i].permissions       = permissions;
-       fenum->ctr3->array[i].num_locks         = num_locks;
-       fenum->ctr3->array[i].path              = fullpath;
-       fenum->ctr3->array[i].user              = username;
+       ctr3->array[ctr3->count] = (struct srvsvc_NetFileInfo3) {
+               .fid            = (((uint32_t)(procid_to_pid(&e->pid))<<16) |
+                                  e->share_file_id),
+               .permissions    = permissions,
+               .path           = fullpath,
+               .user           = username,
+       };
 
-       fenum->ctr3->count++;
+       ctr3->count++;
 
        return 0;
 }
@@ -172,16 +173,31 @@ static WERROR net_enum_files(TALLOC_CTX *ctx,
                             struct srvsvc_NetFileCtr3 **ctr3,
                             uint32_t resume)
 {
-       struct file_enum_count f_enum_cnt;
-
-       f_enum_cnt.ctx = ctx;
-       f_enum_cnt.username = username;
-       f_enum_cnt.ctr3 = *ctr3;
+       struct file_enum_count f_enum_cnt = {
+               .ctx = ctx, .username = username, .ctr3 = *ctr3,
+       };
+       uint32_t i;
 
        share_entry_forall(enum_file_fn, (void *)&f_enum_cnt );
 
        *ctr3 = f_enum_cnt.ctr3;
 
+       /* need to count the number of locks on a file */
+
+       for (i=0; i<(*ctr3)->count; i++) {
+               struct files_struct fsp = { .file_id = f_enum_cnt.fids[i], };
+               struct byte_range_lock *brl = NULL;
+
+               brl = brl_get_locks(ctx, &fsp);
+               if (brl == NULL) {
+                       continue;
+               }
+
+               (*ctr3)->array[i].num_locks = brl_num_locks(brl);
+
+               TALLOC_FREE(brl);
+       }
+
        return WERR_OK;
 }
 
diff --git a/source3/rpcclient/cmd_srvsvc.c b/source3/rpcclient/cmd_srvsvc.c
index 9c000608463..478afc68cd1 100644
--- a/source3/rpcclient/cmd_srvsvc.c
+++ b/source3/rpcclient/cmd_srvsvc.c
@@ -643,9 +643,13 @@ static WERROR cmd_srvsvc_net_file_enum(struct 
rpc_pipe_client *cli,
                                         TALLOC_CTX *mem_ctx,
                                         int argc, const char **argv)
 {
-       uint32_t info_level = 3;
-       struct srvsvc_NetFileInfoCtr info_ctr;
-       struct srvsvc_NetFileCtr3 ctr3;
+       struct srvsvc_NetFileCtr3 ctr3 = { 0 };
+       struct srvsvc_NetFileInfoCtr info_ctr = {
+               .level = 3,
+               .ctr = {
+                       .ctr3 = &ctr3,
+               },
+       };
        WERROR result;
        NTSTATUS status;
        uint32_t preferred_len = 0xffff;
@@ -658,14 +662,9 @@ static WERROR cmd_srvsvc_net_file_enum(struct 
rpc_pipe_client *cli,
                return WERR_OK;
        }
 
-       if (argc == 2)
-               info_level = atoi(argv[1]);
-
-       ZERO_STRUCT(info_ctr);
-       ZERO_STRUCT(ctr3);
-
-       info_ctr.level = info_level;
-       info_ctr.ctr.ctr3 = &ctr3;
+       if (argc == 2) {
+               info_ctr.level = atoi(argv[1]);
+       }
 
        status = dcerpc_srvsvc_NetFileEnum(b, mem_ctx,
                                           cli->desthost,
@@ -685,6 +684,14 @@ static WERROR cmd_srvsvc_net_file_enum(struct 
rpc_pipe_client *cli,
                goto done;
        }
 
+       if (info_ctr.level == 3) {
+               struct srvsvc_NetFileCtr3 *ret = info_ctr.ctr.ctr3;
+               uint32_t i;
+
+               for (i=0; i<ret->count; i++) {
+                       printf("%s\n", ret->array[i].path);
+               }
+       }
  done:
        return result;
 }
diff --git a/source3/script/tests/test_netfileenum.sh 
b/source3/script/tests/test_netfileenum.sh
new file mode 100755
index 00000000000..e917ad42862
--- /dev/null
+++ b/source3/script/tests/test_netfileenum.sh
@@ -0,0 +1,73 @@
+#!/bin/bash
+#
+# Test rpcclient netfileenum
+#
+# Copyright (C) 2020 Volker Lendecke
+
+if [ $# -lt 5 ]; then
+    echo Usage: $0 \
+        SMBCLIENT RPCCLIENT NET SERVER SHARE
+exit 1
+fi
+
+SMBCLIENT="$1"; shift 1
+RPCCLIENT="$1"; shift 1
+NET="$1"; shift 1
+SERVER="$1"; shift 1
+SHARE="$1"; shift 1
+
+incdir=$(dirname $0)/../../../testprogs/blackbox
+. $incdir/subunit.sh
+
+failed=0
+
+rm -f smbclient-stdin smbclient-stdout smbclient-stderr
+mkfifo smbclient-stdin smbclient-stdout smbclient-stderr
+
+CLI_FORCE_INTERACTIVE=1; export CLI_FORCE_INTERACTIVE
+
+${SMBCLIENT} //${SERVER}/${SHARE} ${CONF} -U${USER}%${PASSWORD} \
+            < smbclient-stdin > smbclient-stdout 2>smbclient-stderr &
+CLIENT_PID=$!
+
+sleep 1
+
+exec 100>smbclient-stdin 101<smbclient-stdout 102<smbclient-stderr
+
+# consume the smbclient startup messages
+head -n 1 <&101
+head -n 1 <&102
+
+FILE=x64
+
+printf "open %s\\n" "$FILE" >&100
+
+sleep 1
+
+testit "Create builtin\\administrators group" \
+       "${NET}" groupmap add \
+       sid=S-1-5-32-544 unixgroup="${USER}"-group type=builtin || \
+    failed=$((failed+1))
+testit "Add ${USER} to builtin\\administrators" \
+       "${NET}" groupmap addmem S-1-5-32-544 \
+       $("${NET}" lookup name "${USER}" | cut -d' ' -f1) || \
+    failed=$((failed+1))
+
+"${RPCCLIENT}" "${SERVER}" -U"${USER}"%"${PASSWORD}" -c netfileenum |
+    grep "$FILE"\$
+RC=$?
+testit "netfileenum" test $RC = 0 || failed=$((failed+1))
+
+kill ${CLIENT_PID}
+rm -f smbclient-stdin smbclient-stdout smbclient-stderr
+
+testit "Remove ${USER} from builtin\\administrators" \
+       "${NET}" groupmap delmem S-1-5-32-544 \
+       $("${NET}" lookup name "${USER}" | cut -d' ' -f1) || \
+    failed=$((failed+1))
+testit "Remove builtin\\administrators group" \
+       "${NET}" groupmap delete \
+       sid=S-1-5-32-544 || \
+    failed=$((failed+1))
+
+testok $0 $failed
diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py
index 7309c05a7a5..38ed8c771c2 100755
--- a/source3/selftest/tests.py
+++ b/source3/selftest/tests.py
@@ -923,6 +923,15 @@ plantestsuite("samba3.blackbox.open-eintr", 
"simpleserver:local",
                '$SERVER_IP',
                "error_inject"])
 
+plantestsuite("samba3.blackbox.netfileenum", "simpleserver:local",
+              [os.path.join(samba3srcdir,
+                            "script/tests/test_netfileenum.sh"),
+               os.path.join(bindir(), "smbclient"),
+               os.path.join(bindir(), "rpcclient"),
+               os.path.join(bindir(), "net"),
+               '$SERVER_IP',
+               'tmp'])
+
 plantestsuite("samba3.blackbox.net_tdb", "simpleserver:local",
               [os.path.join(samba3srcdir, "script/tests/test_net_tdb.sh"),
                smbclient3, '$SERVER', 'tmp', '$USERNAME', '$PASSWORD',


-- 
Samba Shared Repository

Reply via email to