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 <me...@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 <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> (cherry picked from commit 0d096931196524a2d1bf59470bc629dc9231131e) Autobuild-User(v4-16-test): Jule Anger <jan...@samba.org> Autobuild-Date(v4-16-test): Fri Jan 13 10:31:22 UTC 2023 on sn-devel-184 commit 6434e2df11e7b5ee1d3dc11f35575808a1e6b50a Author: Stefan Metzmacher <me...@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 <me...@samba.org> Reviewed-by: Andrew Walker <awal...@ixsystems.com> Autobuild-User(master): Stefan Metzmacher <me...@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 <me...@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 <me...@samba.org> Reviewed-by: Andrew Walker <awal...@ixsystems.com> (cherry picked from commit a00c7395fbc7974a61a70ae54ea6ae6349933de2) commit cf2643e0209a080801daa6feb00a21a9bd5825b7 Author: Volker Lendecke <v...@samba.org> Date: Wed Nov 9 14:04:23 2022 +0100 testprogs: Add testit_grep_count() helper Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@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 <a...@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 <a...@samba.org> Reviewed-by: Pavel Filipenský <pfilipen...@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