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

Jule Anger janger at samba.org
Fri Jan 13 10:32:01 UTC 2023


The branch, v4-16-test has been updated
       via  a1fa2c18e56 s4:lib/messaging: fix interaction between imessaging_context_destructor and irpc_destructor
       via  6434e2df11e s3:rpc_server/srvsvc: make sure we (re-)load all shares as root.
       via  ccb8abb0e72 selftest: add samba3.blackbox.registry_share
       via  cf2643e0209 testprogs: Add testit_grep_count() helper
       via  6c5bc77653f testprogs: Reformat subunit.sh
      from  78848f21a3e s3:client: Fix a use-after-free issue in smbclient

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


- Log -----------------------------------------------------------------
commit a1fa2c18e566c8bfd670365ec2d875ad62648d77
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Dec 31 01:24:57 2022 +0100

    s4:lib/messaging: fix interaction between imessaging_context_destructor and irpc_destructor
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15280
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>
    (cherry picked from commit 0d096931196524a2d1bf59470bc629dc9231131e)
    
    Autobuild-User(v4-16-test): Jule Anger <janger at samba.org>
    Autobuild-Date(v4-16-test): Fri Jan 13 10:31:22 UTC 2023 on sn-devel-184

commit 6434e2df11e7b5ee1d3dc11f35575808a1e6b50a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Dec 28 13:50:45 2022 +0100

    s3:rpc_server/srvsvc: make sure we (re-)load all shares as root.
    
    This fixes a regression in commit f03665bb7e8ea97699062630f2aa1bac4c5dfc7f
    
    The use of reload_services() has a lot of side effects, e.g. reopen of
    log files and other things, which are only useful in smbd, but not in rpcd_classic.
    It was also unloading the user and registry shares we loaded a few lines
    above.
    
    We need to do all (re-)loading as root, otherwise we won't be able
    to read root only smb.conf files, access registry shares, ...
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15243
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15266
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Walker <awalker at ixsystems.com>
    
    Autobuild-User(master): Stefan Metzmacher <metze at samba.org>
    Autobuild-Date(master): Thu Dec 29 21:14:02 UTC 2022 on sn-devel-184
    
    (cherry picked from commit f28553105be7465026bcc0fcbbed6a1a8c2133dd)

commit ccb8abb0e727941cb0b22cc55b2190644df81396
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Dec 28 16:18:40 2022 +0100

    selftest: add samba3.blackbox.registry_share
    
    This demonstrates the regression introduced by
    f03665bb7e8ea97699062630f2aa1bac4c5dfc7f, where
    registry shares are no longer listed.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15243
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15266
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Walker <awalker at ixsystems.com>
    (cherry picked from commit a00c7395fbc7974a61a70ae54ea6ae6349933de2)

commit cf2643e0209a080801daa6feb00a21a9bd5825b7
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Nov 9 14:04:23 2022 +0100

    testprogs: Add testit_grep_count() helper
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit 55feb593012fc5b24e795a00081666fca740429c)
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15243
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15266

commit 6c5bc77653f27d2c3edb5248b81d4192b01fe644
Author: Andreas Schneider <asn at samba.org>
Date:   Fri Apr 22 15:46:04 2022 +0200

    testprogs: Reformat subunit.sh
    
    shfmt -w -p -i 0 -fn testprogs/blackbox/subunit.sh
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Pavel Filipenský <pfilipensky at samba.org>
    (cherry picked from commit 561e9256551ae3fe1d6ff4974884714d69d91898)

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

Summary of changes:
 selftest/target/Samba3.pm                   |  30 ++++++
 source3/rpc_server/srvsvc/srv_srvsvc_nt.c   |  28 +++---
 source3/script/tests/test_registry_share.sh |  39 ++++++++
 source3/selftest/tests.py                   |   5 +
 source4/lib/messaging/messaging.c           |  13 +++
 source4/lib/messaging/messaging_internal.h  |   3 +
 testprogs/blackbox/subunit.sh               | 144 ++++++++++++++++++----------
 7 files changed, 197 insertions(+), 65 deletions(-)
 create mode 100755 source3/script/tests/test_registry_share.sh


Changeset truncated at 500 lines:

diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm
index 0b720a68927..cb17408e398 100755
--- a/selftest/target/Samba3.pm
+++ b/selftest/target/Samba3.pm
@@ -529,6 +529,36 @@ sub setup_clusteredmember
 			return undef;
 		}
 
+		my $registry_share_template = "$node_ret->{SERVERCONFFILE}.registry_share_template";
+		unless (open(REGISTRYCONF, ">$registry_share_template")) {
+			warn("Unable to open $registry_share_template");
+			teardown_env($self, $node_ret);
+			teardown_env($self, $ctdb_data);
+			return undef;
+		}
+
+		print REGISTRYCONF "
+[registry_share]
+	copy = tmp
+	comment = smb username is [%U]
+";
+
+		close(REGISTRYCONF);
+
+		my $net = Samba::bindir_path($self, "net");
+		my $cmd = "";
+
+		$cmd .= "UID_WRAPPER_ROOT=1 ";
+		$cmd .= "$net conf import $node_ret->{CONFIGURATION} ${registry_share_template}";
+
+		my $net_ret = system($cmd);
+		if ($net_ret != 0) {
+			warn("net conf import failed: $net_ret\n$cmd");
+			teardown_env($self, $node_ret);
+			teardown_env($self, $ctdb_data);
+			return undef;
+		}
+
 		my $nmblookup = Samba::bindir_path($self, "nmblookup");
 		do {
 			print "Waiting for the LOGON SERVER registration ...\n";
diff --git a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
index 3f268d66080..332f5990078 100644
--- a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
+++ b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
@@ -637,30 +637,34 @@ static WERROR init_srv_share_info_ctr(struct pipes_struct *p,
 	union srvsvc_NetShareCtr ctr;
 	uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0;
 	const char *unix_name = session_info->unix_info->unix_name;
-	int existing_home = lp_servicenumber(unix_name);
+	int existing_home = -1;
 	int added_home = -1;
 	WERROR ret = WERR_OK;
 
 	DEBUG(5,("init_srv_share_info_ctr\n"));
 
-	/* Ensure all the usershares are loaded. */
+	/*
+	 * We need to make sure to reload the services for the connecting user.
+	 * It is possible that we have includes with substitutions.
+	 *
+	 *  include = /etc/samba/%U.conf
+	 *
+	 * We also need all printers and usershares.
+	 *
+	 * We need to be root in order to have access to registry shares
+	 * and root only smb.conf files.
+	 */
 	become_root();
+	lp_kill_all_services();
+	lp_load_with_shares(get_dyn_CONFIGFILE());
 	delete_and_reload_printers();
 	load_usershare_shares(NULL, connections_snum_used);
 	load_registry_shares();
-	unbecome_root();
-
+	existing_home = lp_servicenumber(unix_name);
 	if (existing_home == -1) {
 		added_home = register_homes_share(unix_name);
 	}
-
-	/*
-	 * We need to make sure to reload the services for the connecting user.
-	 * It is possible that the we have includes with substitutions.
-	 *
-	 *  include = /etc/samba/%U.conf
-	 */
-	reload_services(NULL, NULL, false);
+	unbecome_root();
 
 	num_services = lp_numservices();
 
diff --git a/source3/script/tests/test_registry_share.sh b/source3/script/tests/test_registry_share.sh
new file mode 100755
index 00000000000..22e9f732a58
--- /dev/null
+++ b/source3/script/tests/test_registry_share.sh
@@ -0,0 +1,39 @@
+#!/bin/sh
+# Blackbox tests for registry shares
+#
+
+if [ $# -lt 3 ]; then
+	cat <<EOF
+Usage: test_registry_share.sh SERVER USERNAME PASSWORD
+EOF
+	exit 1
+fi
+
+SERVER=$1
+USERNAME=$2
+PASSWORD=$3
+shift 3
+failed=0
+
+samba_bindir="$BINDIR"
+samba_srcdir="$SRCDIR"
+smbclient="$samba_bindir/smbclient"
+rpcclient="$samba_bindir/rpcclient"
+
+. $samba_srcdir/testprogs/blackbox/subunit.sh
+. $samba_srcdir/testprogs/blackbox/common_test_fns.inc
+
+test_smbclient \
+	"Test access to registry share [${USERNAME}]" \
+	"ls" "//${SERVER}/registry_share" "-U$USERNAME%$PASSWORD" ||
+	failed=$((failed + 1))
+
+testit_grep_count \
+	"Test for share enum with registry share" \
+	"netname: registry_share" \
+	1 \
+	${rpcclient} "ncacn_np:${SERVER}" "-U$USERNAME%$PASSWORD" \
+	-c netshareenum ||
+	failed=$((failed + 1))
+
+testok "$0" "$failed"
diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py
index c9384403ba5..31a80b82e87 100755
--- a/source3/selftest/tests.py
+++ b/source3/selftest/tests.py
@@ -1306,6 +1306,11 @@ plantestsuite("samba3.blackbox.smbXsrv_client_dead_rec", "fileserver:local",
                '$SERVER_IP',
                "tmp"])
 
+plantestsuite("samba3.blackbox.registry_share", "clusteredmember",
+              [os.path.join(samba3srcdir,
+                            "script/tests/test_registry_share.sh"),
+               "$SERVER", '$DC_USERNAME', "$DC_PASSWORD"])
+
 env = 'fileserver'
 plantestsuite("samba3.blackbox.virus_scanner", "%s:local" % (env),
               [os.path.join(samba3srcdir,
diff --git a/source4/lib/messaging/messaging.c b/source4/lib/messaging/messaging.c
index 8603c167ad4..67b0366423a 100644
--- a/source4/lib/messaging/messaging.c
+++ b/source4/lib/messaging/messaging.c
@@ -48,6 +48,7 @@
   a pending irpc call
 */
 struct irpc_request {
+	struct irpc_request *prev, *next;
 	struct imessaging_context *msg_ctx;
 	int callid;
 	struct {
@@ -400,6 +401,16 @@ NTSTATUS imessaging_process_cleanup(
 
 static int imessaging_context_destructor(struct imessaging_context *msg)
 {
+	struct irpc_request *irpc = NULL;
+	struct irpc_request *next = NULL;
+
+	for (irpc = msg->requests; irpc != NULL; irpc = next) {
+		next = irpc->next;
+
+		DLIST_REMOVE(msg->requests, irpc);
+		irpc->callid = -1;
+	}
+
 	DLIST_REMOVE(msg_ctxs, msg);
 	TALLOC_FREE(msg->msg_dgm_ref);
 	return 0;
@@ -1035,6 +1046,7 @@ failed:
 static int irpc_destructor(struct irpc_request *irpc)
 {
 	if (irpc->callid != -1) {
+		DLIST_REMOVE(irpc->msg_ctx->requests, irpc);
 		idr_remove(irpc->msg_ctx->idr, irpc->callid);
 		if (irpc->msg_ctx->discard_incoming) {
 			SMB_ASSERT(irpc->msg_ctx->num_incoming_listeners > 0);
@@ -1238,6 +1250,7 @@ static struct tevent_req *irpc_bh_raw_call_send(TALLOC_CTX *mem_ctx,
 	/* make sure we accept incoming messages */
 	SMB_ASSERT(state->irpc->msg_ctx->num_incoming_listeners < UINT64_MAX);
 	state->irpc->msg_ctx->num_incoming_listeners += 1;
+	DLIST_ADD_END(state->irpc->msg_ctx->requests, state->irpc);
 	talloc_set_destructor(state->irpc, irpc_destructor);
 
 	/* setup the header */
diff --git a/source4/lib/messaging/messaging_internal.h b/source4/lib/messaging/messaging_internal.h
index ac254c22631..6281bda82a9 100644
--- a/source4/lib/messaging/messaging_internal.h
+++ b/source4/lib/messaging/messaging_internal.h
@@ -19,6 +19,8 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+struct irpc_request;
+
 struct imessaging_context {
 	struct imessaging_context *prev, *next;
 	struct tevent_context *ev;
@@ -30,6 +32,7 @@ struct imessaging_context {
 	struct idr_context *dispatch_tree;
 	struct irpc_list *irpc;
 	struct idr_context *idr;
+	struct irpc_request *requests;
 	struct server_id_db *names;
 	struct timeval start_time;
 	void *msg_dgm_ref;
diff --git a/testprogs/blackbox/subunit.sh b/testprogs/blackbox/subunit.sh
index 45183575bdd..ba4e997c525 100755
--- a/testprogs/blackbox/subunit.sh
+++ b/testprogs/blackbox/subunit.sh
@@ -18,69 +18,74 @@
 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #
 
-timestamp() {
-  # mark the start time. With Gnu date, you get nanoseconds from %N
-  # (here truncated to microseconds with %6N), but not on BSDs,
-  # Solaris, etc, which will apparently leave either %N or N at the end.
-  date -u +'time: %Y-%m-%d %H:%M:%S.%6NZ' | sed 's/\..*NZ$/.000000Z/'
+timestamp()
+{
+	# mark the start time. With Gnu date, you get nanoseconds from %N
+	# (here truncated to microseconds with %6N), but not on BSDs,
+	# Solaris, etc, which will apparently leave either %N or N at the end.
+	date -u +'time: %Y-%m-%d %H:%M:%S.%6NZ' | sed 's/\..*NZ$/.000000Z/'
 }
 
-subunit_start_test () {
-  # emit the current protocol start-marker for test $1
-  timestamp
-  printf 'test: %s\n' "$1"
+subunit_start_test()
+{
+	# emit the current protocol start-marker for test $1
+	timestamp
+	printf 'test: %s\n' "$1"
 }
 
-
-subunit_pass_test () {
-  # emit the current protocol test passed marker for test $1
-  timestamp
-  printf 'success: %s\n' "$1"
+subunit_pass_test()
+{
+	# emit the current protocol test passed marker for test $1
+	timestamp
+	printf 'success: %s\n' "$1"
 }
 
 # This is just a hack as we have some broken scripts
 # which use "exit $failed", without initializing failed.
 failed=0
 
-subunit_fail_test () {
-  # emit the current protocol fail-marker for test $1, and emit stdin as
-  # the error text.
-  # we use stdin because the failure message can be arbitrarily long, and this
-  # makes it convenient to write in scripts (using <<END syntax.
-  timestamp
-  printf 'failure: %s [\n' "$1"
-  cat -
-  printf '\n]\n'
+subunit_fail_test()
+{
+	# emit the current protocol fail-marker for test $1, and emit stdin as
+	# the error text.
+	# we use stdin because the failure message can be arbitrarily long, and this
+	# makes it convenient to write in scripts (using <<END syntax.
+	timestamp
+	printf 'failure: %s [\n' "$1"
+	cat -
+	printf '\n]\n'
 }
 
-
-subunit_error_test () {
-  # emit the current protocol error-marker for test $1, and emit stdin as
-  # the error text.
-  # we use stdin because the failure message can be arbitrarily long, and this
-  # makes it convenient to write in scripts (using <<END syntax.
-  timestamp
-  printf 'error: %s [\n' "$1"
-  cat -
-  printf '\n]\n'
+subunit_error_test()
+{
+	# emit the current protocol error-marker for test $1, and emit stdin as
+	# the error text.
+	# we use stdin because the failure message can be arbitrarily long, and this
+	# makes it convenient to write in scripts (using <<END syntax.
+	timestamp
+	printf 'error: %s [\n' "$1"
+	cat -
+	printf '\n]\n'
 }
 
-subunit_skip_test () {
-  # emit the current protocol skip-marker for test $1, and emit stdin as
-  # the error text.
-  # we use stdin because the failure message can be arbitrarily long, and this
-  # makes it convenient to write in scripts (using <<END syntax.
-  printf 'skip: %s [\n' "$1"
-  cat -
-  printf '\n]\n'
+subunit_skip_test()
+{
+	# emit the current protocol skip-marker for test $1, and emit stdin as
+	# the error text.
+	# we use stdin because the failure message can be arbitrarily long, and this
+	# makes it convenient to write in scripts (using <<END syntax.
+	printf 'skip: %s [\n' "$1"
+	cat -
+	printf '\n]\n'
 }
 
-testit () {
+testit()
+{
 	name="$1"
 	shift
 	cmdline="$@"
 	subunit_start_test "$name"
-	output=`$cmdline 2>&1`
+	output=$($cmdline 2>&1)
 	status=$?
 	if [ x$status = x0 ]; then
 		subunit_pass_test "$name"
@@ -92,14 +97,15 @@ testit () {
 
 # This returns 0 if the command gave success and the grep value was found
 # all other cases return != 0
-testit_grep () {
+testit_grep()
+{
 	name="$1"
 	shift
 	grep="$1"
 	shift
 	cmdline="$@"
 	subunit_start_test "$name"
-	output=`$cmdline 2>&1`
+	output=$($cmdline 2>&1)
 	status=$?
 	if [ x$status != x0 ]; then
 		printf '%s' "$output" | subunit_fail_test "$name"
@@ -115,12 +121,42 @@ testit_grep () {
 	return $status
 }
 
-testit_expect_failure () {
+# This returns 0 if the command gave success and the grep value was found
+# num times all other cases return != 0
+testit_grep_count()
+{
+	name="$1"
+	shift
+	grep="$1"
+	shift
+	num="$1"
+	shift
+	cmdline="$@"
+	subunit_start_test "$name"
+	output=$($cmdline 2>&1)
+	status=$?
+	if [ x$status != x0 ]; then
+		printf '%s' "$output" | subunit_fail_test "$name"
+		return $status
+	fi
+	found=$(printf '%s' "$output" | grep -c "$grep")
+	if [ x"$found" = x"$num" ]; then
+	    subunit_pass_test "$name"
+	else
+	    printf 'GREP: "%s" found "%d" times, expected "%d" in output:\n%s'\
+		   "$grep" "$found" "$num" "$output" |
+		subunit_fail_test "$name"
+	fi
+	return $status
+}
+
+testit_expect_failure()
+{
 	name="$1"
 	shift
 	cmdline="$@"
 	subunit_start_test "$name"
-	output=`$cmdline 2>&1`
+	output=$($cmdline 2>&1)
 	status=$?
 	if [ x$status = x0 ]; then
 		echo "$output" | subunit_fail_test "$name"
@@ -132,14 +168,15 @@ testit_expect_failure () {
 
 # This returns 0 if the command gave a failure and the grep value was found
 # all other cases return != 0
-testit_expect_failure_grep () {
+testit_expect_failure_grep()
+{
 	name="$1"
 	shift
 	grep="$1"
 	shift
 	cmdline="$@"
 	subunit_start_test "$name"
-	output=`$cmdline 2>&1`
+	output=$($cmdline 2>&1)
 	status=$?
 	if [ x$status = x0 ]; then
 		printf '%s' "$output" | subunit_fail_test "$name"
@@ -155,8 +192,9 @@ testit_expect_failure_grep () {
 	return $status
 }
 
-testok () {
-	name=`basename $1`
+testok()
+{
+	name=$(basename $1)
 	failed=$2
 
 	exit $failed
@@ -164,8 +202,8 @@ testok () {
 
 # work out the top level source directory
 if [ -d source4 ]; then
-    SRCDIR="."
+	SRCDIR="."
 else
-    SRCDIR=".."
+	SRCDIR=".."
 fi
 export SRCDIR


-- 
Samba Shared Repository



More information about the samba-cvs mailing list