[SCM] Samba Shared Repository - branch v4-17-stable updated

Jule Anger janger at samba.org
Thu Mar 9 09:21:53 UTC 2023


The branch, v4-17-stable has been updated
       via  46e771776b2 VERSION: Disable GIT_SNAPSHOT for the 4.17.6 release.
       via  418af42a77f WHATSNEW: Add release notes for Samba 4.17.6.
       via  ec6a057e690 s3: smbd: Fix fsp/fd leak when looking up a non-existent stream name on a file.
       via  460bc1897a3 s3: tests: Add new test_stream_dir_rename.sh test.
       via  1caac94128e s3: provision: Add new streams_xattr_nostrict share - needs "strict rename = no".
       via  bfbb854d746 rpcd: With npa->need_idle_server we can have more than 256 servers
       via  743d7600fba rpcd: Do blocking connects to local pipes
       via  32a6eb37fbd rpcd: Increase listening queue
       via  529e76a51df torture3: test rpc scalability
       via  f07883a09ea librpc: Remove unused sync rpc_transport_np_init()
       via  dbb9cb6bfad librpc: Make rpc_pipe_open_np() public and async
       via  f4556250b87 lib:util: File descriptor being closed repeatedly.
       via  0b8713e342c vfs_ceph: use fsp_get_pathref_fd in ceph fstatat and close vfs calls
       via  79c06ede865 mdssvc: fix kMDScopeArray parsing
       via  cee7ecee5ca s4-drsuapi: Give an error that matches windows on destination_dsa_guid lookup failure
       via  c7658589fa5 s4-drsuapi: Clarify role of drs_security_access_check_nc_root()
       via  dee90673865 s4-rpc_server: Pre-check destination_dsa_guid in GetNCChanges for validity
       via  be0cb189202 s4-drsuapi: Use samdb_get_ntds_obj_by_guid() to find RODC in REPL_SECRET
       via  fba94e5d504 s4-dsdb: Require that the NTDS object is an nTDSDSA objectclass
       via  bcb89bd81d4 s4-dsdb: Split samdb_get_ntds_obj_by_guid() out of samdb_is_rodc()
       via  a78c2094ff5 s4-rpc_server/drsuapi: Return correct error code for an invalid DN to EXOP_REPL_OBJ/EXOP_REPL_OBJ
       via  764702f788c s4-drs: Make drs_ObjectIdentifier_to_dn() safer and able to cope with DummyDN values
       via  7c32d3d75aa s4-dsdb: rework drs_ObjectIdentifier_to_dn() into drs_ObjectIdentifier_to_dn_and_nc_root()
       via  85cc464195b s4-rpc_server/drsuapi: Use dsdb_normalise_dn_and_find_nc_root()
       via  96adf5afc01 s4-dsdb: Add dsdb_normalise_dn_and_find_nc_root() around dsdb_find_nc_root()
       via  deac11ab428 s4-dsdb: Add better debugging to dsdb_objects_have_same_nc()
       via  4413c277ef0 s4-dsdb: Make dsdb_find_nc_root() first try and use DSDB_CONTROL_CURRENT_PARTITION_OID
       via  24adeb3ad11 s4-dsdb: Schedule SD propegation only after successful rename
       via  fedd276dbf1 s4-selftest/drs: Confirm GetNCChanges REPL_SECRET works with a DummyDN and real GUID
       via  f6ebb660e54 s4-selftest/drs: Confirm GetNCChanges full replication works with a DummyDN and real GUID
       via  fcc25f6baf8 s4-selftest/drs: Confirm GetNCChanges REPL_OBJ works with a DummyDN and real GUID
       via  b0bbea3fdcd s4-selftest/drs Allow re-run of DRS tests after failed cleanup
       via  2cb965046b8 s4-selftest/drs Allow some DRS tests to operate against an IP
       via  a81be075983 s4-selftest/drs Add test of expected return code for invaid DNs in GetNCChanges
       via  00d1f6223f2 s4-dsdb: Add tests of SamDB.get_nc_root()
       via  ddf64adea13 s3/lib: Prevent use after free of messaging_ctdb_fde_ev structs
       via  e12898ff72c VERSION: Bump version up to Samba 4.17.6...
      from  420b9e67870 VERSION: Disable GIT_SNAPSHOT for the 4.17.5 release.

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


- Log -----------------------------------------------------------------
-----------------------------------------------------------------------

Summary of changes:
 VERSION                                        |   2 +-
 WHATSNEW.txt                                   |  65 ++++-
 lib/util/util_file.c                           |   9 +-
 python/samba/tests/dsdb.py                     | 122 +++++++++
 selftest/target/Samba3.pm                      |   5 +
 source3/lib/messages_ctdb.c                    |  19 ++
 source3/librpc/idl/rpc_host.idl                |   2 +-
 source3/modules/vfs_ceph.c                     |   7 +-
 source3/rpc_client/cli_pipe.c                  | 132 +++++++---
 source3/rpc_client/cli_pipe.h                  |  13 +
 source3/rpc_client/local_np.c                  |  14 +-
 source3/rpc_client/rpc_transport.h             |   3 -
 source3/rpc_client/rpc_transport_np.c          |  31 ---
 source3/rpc_server/mdssvc/mdssvc.c             |   6 +
 source3/rpc_server/rpc_host.c                  |   2 +-
 source3/rpc_server/rpc_worker.c                |   2 +-
 source3/script/tests/test_stream_dir_rename.sh |  72 ++++++
 source3/selftest/tests.py                      |   4 +
 source3/smbd/filename.c                        |  21 ++
 source3/torture/proto.h                        |   1 +
 source3/torture/test_rpc_scale.c               | 301 ++++++++++++++++++++++
 source3/torture/torture.c                      |   4 +
 source3/torture/wscript_build                  |   1 +
 source4/dsdb/common/dsdb_dn.c                  | 183 +++++++++++++-
 source4/dsdb/common/util.c                     | 335 +++++++++++++++++++++++--
 source4/dsdb/samdb/ldb_modules/descriptor.c    | 134 +++++++---
 source4/rpc_server/drsuapi/drsutil.c           |  28 ++-
 source4/rpc_server/drsuapi/getncchanges.c      | 182 +++++++++++---
 source4/rpc_server/drsuapi/updaterefs.c        |  39 ++-
 source4/torture/drs/python/drs_base.py         |  15 +-
 source4/torture/drs/python/getnc_exop.py       | 169 ++++++++++++-
 source4/torture/drs/python/getncchanges.py     |  52 +++-
 source4/torture/drs/python/repl_move.py        |  11 +-
 source4/torture/drs/python/repl_rodc.py        |  46 ++++
 source4/torture/drs/python/repl_schema.py      |   9 +-
 35 files changed, 1813 insertions(+), 228 deletions(-)
 create mode 100755 source3/script/tests/test_stream_dir_rename.sh
 create mode 100644 source3/torture/test_rpc_scale.c


Changeset truncated at 500 lines:

diff --git a/VERSION b/VERSION
index 604c5f065ca..16716ac7539 100644
--- a/VERSION
+++ b/VERSION
@@ -25,7 +25,7 @@
 ########################################################
 SAMBA_VERSION_MAJOR=4
 SAMBA_VERSION_MINOR=17
-SAMBA_VERSION_RELEASE=5
+SAMBA_VERSION_RELEASE=6
 
 ########################################################
 # If a official release has a serious bug              #
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index 5eb0a0281c1..865697ce109 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -1,3 +1,65 @@
+                   ==============================
+                   Release Notes for Samba 4.17.6
+                           March 09, 2023
+                   ==============================
+
+
+This is the latest stable release of the Samba 4.17 release series.
+
+
+Changes since 4.17.5
+--------------------
+
+o  Jeremy Allison <jra at samba.org>
+   * BUG 15314: streams_xattr is creating unexpected locks on folders.
+
+o  Andrew Bartlett <abartlet at samba.org>
+   * BUG 10635: Use of the Azure AD Connect cloud sync tool is now supported for
+     password hash synchronisation, allowing Samba AD Domains to synchronise
+     passwords with this popular cloud environment.
+
+o  Ralph Boehme <slow at samba.org>
+   * BUG 15299: Spotlight doesn't work with latest macOS Ventura.
+
+o  Volker Lendecke <vl at samba.org>
+   * BUG 15310: New samba-dcerpc architecture does not scale gracefully.
+
+o  John Mulligan <jmulligan at redhat.com>
+   * BUG 15307: vfs_ceph incorrectly uses fsp_get_io_fd() instead of
+     fsp_get_pathref_fd() in close and fstat.
+
+o  Noel Power <noel.power at suse.com>
+   * BUG 15293: With clustering enabled samba-bgqd can core dump due to use
+     after free.
+
+o  baixiangcpp <baixiangcpp at gmail.com>
+   * BUG 15311: fd_load() function implicitly closes the fd where it should not.
+
+
+#######################################
+Reporting bugs & Development Discussion
+#######################################
+
+Please discuss this release on the samba-technical mailing list or by
+joining the #samba-technical:matrix.org matrix room, or
+#samba-technical IRC channel on irc.libera.chat.
+
+
+If you do report problems then please try to send high quality
+feedback. If you don't provide vital information to help us track down
+the problem then you will probably be ignored.  All bug reports should
+be filed under the Samba 4.1 and newer product in the project's Bugzilla
+database (https://bugzilla.samba.org/).
+
+
+======================================================================
+== Our Code, Our Bugs, Our Responsibility.
+== The Samba Team
+======================================================================
+
+
+Release notes for older releases follow:
+----------------------------------------
                    ==============================
                    Release Notes for Samba 4.17.5
                           January 26, 2023
@@ -78,8 +140,7 @@ database (https://bugzilla.samba.org/).
 ======================================================================
 
 
-Release notes for older releases follow:
-----------------------------------------
+----------------------------------------------------------------------
                    ==============================
                    Release Notes for Samba 4.17.4
                          December 15, 2022
diff --git a/lib/util/util_file.c b/lib/util/util_file.c
index af90e4a7621..fa5abadedec 100644
--- a/lib/util/util_file.c
+++ b/lib/util/util_file.c
@@ -175,13 +175,20 @@ _PUBLIC_ char *fd_load(int fd, size_t *psize, size_t maxsize, TALLOC_CTX *mem_ct
 	size_t size = 0;
 	size_t chunk = 1024;
 	int err;
+	int fd_dup;
 
 	if (maxsize == 0) {
 		maxsize = SIZE_MAX;
 	}
 
-	file = fdopen(fd, "r");
+	fd_dup = dup(fd);
+	if (fd_dup == -1) {
+		return NULL;
+	}
+
+	file = fdopen(fd_dup, "r");
 	if (file == NULL) {
+		close(fd_dup);
 		return NULL;
 	}
 
diff --git a/python/samba/tests/dsdb.py b/python/samba/tests/dsdb.py
index f4f7a705626..6c52994ece7 100644
--- a/python/samba/tests/dsdb.py
+++ b/python/samba/tests/dsdb.py
@@ -1029,6 +1029,128 @@ class DsdbTests(TestCase):
                                 str(part_dn) + "," + str(domain_dn)),
                          self.samdb.normalize_dn_in_domain(part_dn))
 
+class DsdbNCRootTests(TestCase):
+
+    def setUp(self):
+        super().setUp()
+        self.lp = samba.tests.env_loadparm()
+        self.creds = Credentials()
+        self.creds.guess(self.lp)
+        self.session = system_session()
+        self.samdb = SamDB(session_info=self.session,
+                           credentials=self.creds,
+                           lp=self.lp)
+        self.remote = False
+
+    # These all use the local mode of operation inside
+    # dsdb_find_nc_root() using the partitions control
+    def test_dsdb_dn_nc_root_sid(self):
+        dom_sid = self.samdb.get_domain_sid()
+        domain_dn = ldb.Dn(self.samdb, self.samdb.domain_dn())
+        dn = ldb.Dn(self.samdb, f"<SID={dom_sid}>")
+        try:
+            nc_root = self.samdb.get_nc_root(dn)
+        except ldb.LdbError as e:
+            (code, msg) = e.args
+            self.fail("Got unexpected exception %d - %s "
+                      % (code, msg))
+        self.assertEqual(domain_dn, nc_root)
+
+    def test_dsdb_dn_nc_root_admin_sid(self):
+        dom_sid = self.samdb.get_domain_sid()
+        domain_dn = ldb.Dn(self.samdb, self.samdb.domain_dn())
+        dn = ldb.Dn(self.samdb, f"<SID={dom_sid}-500>")
+        try:
+            nc_root = self.samdb.get_nc_root(dn)
+        except ldb.LdbError as e:
+            (code, msg) = e.args
+            self.fail("Got unexpected exception %d - %s "
+                      % (code, msg))
+        self.assertEqual(domain_dn, nc_root)
+
+    def test_dsdb_dn_nc_root_users_container(self):
+        dom_sid = self.samdb.get_domain_sid()
+        domain_dn = ldb.Dn(self.samdb, self.samdb.domain_dn())
+        dn = ldb.Dn(self.samdb, f"CN=Users,{domain_dn}")
+        try:
+            nc_root = self.samdb.get_nc_root(dn)
+        except ldb.LdbError as e:
+            (code, msg) = e.args
+            self.fail("Got unexpected exception %d - %s "
+                      % (code, msg))
+        self.assertEqual(domain_dn, nc_root)
+
+    def test_dsdb_dn_nc_root_new_dn(self):
+        dom_sid = self.samdb.get_domain_sid()
+        domain_dn = ldb.Dn(self.samdb, self.samdb.domain_dn())
+        dn = ldb.Dn(self.samdb, f"CN=Xnotexisting,CN=Users,{domain_dn}")
+        try:
+            nc_root = self.samdb.get_nc_root(dn)
+        except ldb.LdbError as e:
+            (code, msg) = e.args
+            self.fail("Got unexpected exception %d - %s "
+                      % (code, msg))
+        self.assertEqual(domain_dn, nc_root)
+
+    def test_dsdb_dn_nc_root_new_dn_with_guid(self):
+        domain_dn = ldb.Dn(self.samdb, self.samdb.domain_dn())
+        dn = ldb.Dn(self.samdb, f"<GUID=828e3baf-fa02-4d82-ba5d-6f647dab5fd8>;CN=Xnotexisting,CN=Users,{domain_dn}")
+        try:
+            nc_root = self.samdb.get_nc_root(dn)
+        except ldb.LdbError as e:
+            (code, msg) = e.args
+            self.fail("Got unexpected exception %d - %s "
+                      % (code, msg))
+        self.assertEqual(domain_dn, nc_root)
+
+    def test_dsdb_dn_nc_root_guid(self):
+        ntds_guid = self.samdb.get_ntds_GUID()
+        configuration_dn = self.samdb.get_config_basedn()
+        dn = ldb.Dn(self.samdb, f"<GUID={ntds_guid}>")
+        try:
+            nc_root = self.samdb.get_nc_root(dn)
+        except ldb.LdbError as e:
+            (code, msg) = e.args
+            self.fail("Got unexpected exception %d - %s "
+                      % (code, msg))
+        self.assertEqual(configuration_dn, nc_root)
+
+    def test_dsdb_dn_nc_root_misleading_to_noexisting_guid(self):
+        ntds_guid = self.samdb.get_ntds_GUID()
+        configuration_dn = self.samdb.get_config_basedn()
+        domain_dn = ldb.Dn(self.samdb, self.samdb.domain_dn())
+        dn = ldb.Dn(self.samdb, f"<GUID={ntds_guid}>;CN=Xnotexisting,CN=Users,{domain_dn}")
+        try:
+            nc_root = self.samdb.get_nc_root(dn)
+        except ldb.LdbError as e:
+            (code, msg) = e.args
+            self.fail("Got unexpected exception %d - %s "
+                      % (code, msg))
+        self.assertEqual(configuration_dn, nc_root)
+
+    def test_dsdb_dn_nc_root_misleading_to_existing_guid(self):
+        ntds_guid = self.samdb.get_ntds_GUID()
+        configuration_dn = self.samdb.get_config_basedn()
+        domain_dn = ldb.Dn(self.samdb, self.samdb.domain_dn())
+        dn = ldb.Dn(self.samdb, f"<GUID={ntds_guid}>;{domain_dn}")
+        try:
+            nc_root = self.samdb.get_nc_root(dn)
+        except ldb.LdbError as e:
+            (code, msg) = e.args
+            self.fail("Got unexpected exception %d - %s "
+                      % (code, msg))
+        self.assertEqual(configuration_dn, nc_root)
+
+class DsdbRemoteNCRootTests(DsdbNCRootTests):
+    def setUp(self):
+        super().setUp()
+        # Reconnect to the remote LDAP port
+        self.samdb = SamDB(url="ldap://%s" % samba.tests.env_get_var_value('SERVER'),
+                           session_info=self.session,
+                           credentials=self.get_credentials(),
+                           lp=self.lp)
+        self.remote = True
+
 
 class DsdbFullScanTests(TestCase):
 
diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm
index c22b382a24e..f9c732284c2 100755
--- a/selftest/target/Samba3.pm
+++ b/selftest/target/Samba3.pm
@@ -3434,6 +3434,11 @@ sub provision($$)
 	copy = tmp
 	vfs objects = streams_xattr xattr_tdb
 
+[streams_xattr_nostrict]
+	copy = tmp
+	strict rename = no
+	vfs objects = streams_xattr xattr_tdb
+
 [acl_streams_xattr]
 	copy = tmp
 	vfs objects = acl_xattr streams_xattr fake_acls xattr_tdb
diff --git a/source3/lib/messages_ctdb.c b/source3/lib/messages_ctdb.c
index 3e784bf7237..d55b53bf601 100644
--- a/source3/lib/messages_ctdb.c
+++ b/source3/lib/messages_ctdb.c
@@ -76,6 +76,21 @@ static int messaging_ctdb_recv(
 
 struct messaging_ctdb_context *global_ctdb_context;
 
+static int global_ctdb_ctx_destructor(struct messaging_ctdb_context *ctx)
+{
+	if (ctx != NULL) {
+		struct messaging_ctdb_fde_ev *fde_ev = NULL;
+		for (fde_ev = ctx->fde_evs;
+		     fde_ev != NULL;
+		     fde_ev = fde_ev->next) {
+			if (fde_ev->ctx == ctx) {
+				fde_ev->ctx = NULL;
+			}
+		}
+	}
+	return 0;
+}
+
 int messaging_ctdb_init(const char *sockname, int timeout, uint64_t unique_id,
 			void (*recv_cb)(struct tevent_context *ev,
 					const uint8_t *msg, size_t msg_len,
@@ -94,6 +109,10 @@ int messaging_ctdb_init(const char *sockname, int timeout, uint64_t unique_id,
 	if (ctx == NULL) {
 		return ENOMEM;
 	}
+
+	talloc_set_destructor(ctx,
+			      global_ctdb_ctx_destructor);
+
 	ctx->recv_cb = recv_cb;
 	ctx->recv_cb_private_data = private_data;
 
diff --git a/source3/librpc/idl/rpc_host.idl b/source3/librpc/idl/rpc_host.idl
index 0fc3f9514aa..c8abb6c4379 100644
--- a/source3/librpc/idl/rpc_host.idl
+++ b/source3/librpc/idl/rpc_host.idl
@@ -66,7 +66,7 @@ interface rpc_host_msg
 		/**
 		 * @brief Which of the processes of a helper prog is this from
 		 */
-		uint8 worker_index;
+		uint32 worker_index;
 
 		/**
 		 * @brief How many clients this process serves right now
diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c
index 2186bfdb2ce..f6d8f9d2641 100644
--- a/source3/modules/vfs_ceph.c
+++ b/source3/modules/vfs_ceph.c
@@ -464,7 +464,7 @@ static int cephwrap_close(struct vfs_handle_struct *handle, files_struct *fsp)
 	int result;
 
 	DBG_DEBUG("[CEPH] close(%p, %p)\n", handle, fsp);
-	result = ceph_close(handle->data, fsp_get_io_fd(fsp));
+	result = ceph_close(handle->data, fsp_get_pathref_fd(fsp));
 	DBG_DEBUG("[CEPH] close(...) = %d\n", result);
 
 	WRAP_RETURN(result);
@@ -788,9 +788,10 @@ static int cephwrap_fstat(struct vfs_handle_struct *handle, files_struct *fsp, S
 {
 	int result = -1;
 	struct ceph_statx stx;
+	int fd = fsp_get_pathref_fd(fsp);
 
-	DBG_DEBUG("[CEPH] fstat(%p, %d)\n", handle, fsp_get_io_fd(fsp));
-	result = ceph_fstatx(handle->data, fsp_get_io_fd(fsp), &stx,
+	DBG_DEBUG("[CEPH] fstat(%p, %d)\n", handle, fd);
+	result = ceph_fstatx(handle->data, fd, &stx,
 				SAMBA_STATX_ATTR_MASK, 0);
 	DBG_DEBUG("[CEPH] fstat(...) = %d\n", result);
 	if (result < 0) {
diff --git a/source3/rpc_client/cli_pipe.c b/source3/rpc_client/cli_pipe.c
index 5e26dc1806d..2af68b169af 100644
--- a/source3/rpc_client/cli_pipe.c
+++ b/source3/rpc_client/cli_pipe.c
@@ -3172,74 +3172,142 @@ static int rpc_pipe_client_np_ref_destructor(struct rpc_pipe_client_np_ref *np_r
  *
  ****************************************************************************/
 
-static NTSTATUS rpc_pipe_open_np(struct cli_state *cli,
-				 const struct ndr_interface_table *table,
-				 struct rpc_pipe_client **presult)
-{
+struct rpc_pipe_open_np_state {
+	struct cli_state *cli;
+	const struct ndr_interface_table *table;
 	struct rpc_pipe_client *result;
-	NTSTATUS status;
-	struct rpc_pipe_client_np_ref *np_ref;
+};
+
+static void rpc_pipe_open_np_done(struct tevent_req *subreq);
 
-	/* sanity check to protect against crashes */
+struct tevent_req *rpc_pipe_open_np_send(
+	TALLOC_CTX *mem_ctx,
+	struct tevent_context *ev,
+	struct cli_state *cli,
+	const struct ndr_interface_table *table)
+{
+	struct tevent_req *req = NULL, *subreq = NULL;
+	struct rpc_pipe_open_np_state *state = NULL;
+	struct rpc_pipe_client *result = NULL;
 
-	if ( !cli ) {
-		return NT_STATUS_INVALID_HANDLE;
+	req = tevent_req_create(
+		mem_ctx, &state, struct rpc_pipe_open_np_state);
+	if (req == NULL) {
+		return NULL;
 	}
+	state->cli = cli;
+	state->table = table;
 
-	result = talloc_zero(NULL, struct rpc_pipe_client);
-	if (result == NULL) {
-		return NT_STATUS_NO_MEMORY;
+	state->result = talloc_zero(state, struct rpc_pipe_client);
+	if (tevent_req_nomem(state->result, req)) {
+		return tevent_req_post(req, ev);
 	}
+	result = state->result;
 
 	result->abstract_syntax = table->syntax_id;
 	result->transfer_syntax = ndr_transfer_syntax_ndr;
 
 	result->desthost = talloc_strdup(
 		result, smbXcli_conn_remote_name(cli->conn));
-	if (result->desthost == NULL) {
-		TALLOC_FREE(result);
-		return NT_STATUS_NO_MEMORY;
+	if (tevent_req_nomem(result->desthost, req)) {
+		return tevent_req_post(req, ev);
 	}
 
 	result->srv_name_slash = talloc_asprintf_strupper_m(
 		result, "\\\\%s", result->desthost);
-	if (result->srv_name_slash == NULL) {
-		TALLOC_FREE(result);
-		return NT_STATUS_NO_MEMORY;
+	if (tevent_req_nomem(result->srv_name_slash, req)) {
+		return tevent_req_post(req, ev);
 	}
 
 	result->max_xmit_frag = RPC_MAX_PDU_FRAG_LEN;
 
-	status = rpc_transport_np_init(result, cli, table,
-				       &result->transport);
-	if (!NT_STATUS_IS_OK(status)) {
-		TALLOC_FREE(result);
-		return status;
+	subreq = rpc_transport_np_init_send(state, ev, cli, table);
+	if (tevent_req_nomem(subreq, req)) {
+		return tevent_req_post(req, ev);
+	}
+	tevent_req_set_callback(subreq, rpc_pipe_open_np_done, req);
+	return req;
+}
+
+static void rpc_pipe_open_np_done(struct tevent_req *subreq)
+{
+	struct tevent_req *req = tevent_req_callback_data(
+		subreq, struct tevent_req);
+	struct rpc_pipe_open_np_state *state = tevent_req_data(
+		req, struct rpc_pipe_open_np_state);
+	struct rpc_pipe_client *result = state->result;
+	struct rpc_pipe_client_np_ref *np_ref = NULL;
+	NTSTATUS status;
+
+	status = rpc_transport_np_init_recv(
+		subreq, result, &result->transport);
+	TALLOC_FREE(subreq);
+	if (tevent_req_nterror(req, status)) {
+		return;
 	}
 
 	result->transport->transport = NCACN_NP;
 
 	np_ref = talloc(result->transport, struct rpc_pipe_client_np_ref);
-	if (np_ref == NULL) {
-		TALLOC_FREE(result);
-		return NT_STATUS_NO_MEMORY;
+	if (tevent_req_nomem(np_ref, req)) {
+		return;
 	}
-	np_ref->cli = cli;
+	np_ref->cli = state->cli;
 	np_ref->pipe = result;
 
 	DLIST_ADD(np_ref->cli->pipe_list, np_ref->pipe);
 	talloc_set_destructor(np_ref, rpc_pipe_client_np_ref_destructor);
 
-	result->binding_handle = rpccli_bh_create(result, NULL, table);
-	if (result->binding_handle == NULL) {
-		TALLOC_FREE(result);
-		return NT_STATUS_NO_MEMORY;
+	result->binding_handle = rpccli_bh_create(result, NULL, state->table);
+	if (tevent_req_nomem(result->binding_handle, req)) {
+		return;
 	}
 
-	*presult = result;
+	tevent_req_done(req);
+}
+
+NTSTATUS rpc_pipe_open_np_recv(
+	struct tevent_req *req,
+	TALLOC_CTX *mem_ctx,
+	struct rpc_pipe_client **_result)
+{
+	struct rpc_pipe_open_np_state *state = tevent_req_data(
+		req, struct rpc_pipe_open_np_state);
+	NTSTATUS status;
+
+	if (tevent_req_is_nterror(req, &status)) {
+		return status;
+	}
+	*_result = talloc_move(mem_ctx, &state->result);
 	return NT_STATUS_OK;
 }
 
+NTSTATUS rpc_pipe_open_np(struct cli_state *cli,
+			  const struct ndr_interface_table *table,
+			  struct rpc_pipe_client **presult)
+{
+	struct tevent_context *ev = NULL;
+	struct tevent_req *req = NULL;


-- 
Samba Shared Repository



More information about the samba-cvs mailing list