svn commit: samba r4624 - in branches/SAMBA_4_0/source: build/pidl
lib/dcom lib/dcom/classes lib/dcom/common torture/dcom
jelmer at samba.org
jelmer at samba.org
Sun Jan 9 21:35:37 GMT 2005
Author: jelmer
Date: 2005-01-09 21:35:37 +0000 (Sun, 09 Jan 2005)
New Revision: 4624
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=4624
Log:
Several crash fixes for DCOM
More work on the example class implementation
Added:
branches/SAMBA_4_0/source/lib/dcom/remote/
Modified:
branches/SAMBA_4_0/source/build/pidl/proxy.pm
branches/SAMBA_4_0/source/lib/dcom/classes/simple.c
branches/SAMBA_4_0/source/lib/dcom/common/main.c
branches/SAMBA_4_0/source/lib/dcom/common/tables.c
branches/SAMBA_4_0/source/lib/dcom/config.mk
branches/SAMBA_4_0/source/torture/dcom/simple.c
Changeset:
Modified: branches/SAMBA_4_0/source/build/pidl/proxy.pm
===================================================================
--- branches/SAMBA_4_0/source/build/pidl/proxy.pm 2005-01-09 19:06:49 UTC (rev 4623)
+++ branches/SAMBA_4_0/source/build/pidl/proxy.pm 2005-01-09 21:35:37 UTC (rev 4624)
@@ -139,7 +139,14 @@
$res .="
NTSTATUS dcom_$interface->{NAME}_$name (struct dcom_interface_p *d, TALLOC_CTX *mem_ctx, struct $name *r)
{
- return ((const struct dcom_$interface->{NAME}_vtable *)d->vtable)->$name (d, mem_ctx, r);
+ const struct dcom_$interface->{NAME}_vtable *table = d->vtable;
+
+ if (table->$name == NULL) {
+ DEBUG(0, (\"Object does not implement $name of interface $interface->{NAME}\\n\"));
+ return NT_STATUS_NOT_IMPLEMENTED;
+ }
+
+ return table->$name (d, mem_ctx, r);
}
";
}
@@ -151,7 +158,7 @@
{
my($interface) = shift;
my($data) = $interface->{DATA};
- $res = "/* DCOM stubs generated by pidl */\n\n";
+ $res = "/* DCOM proxy generated by pidl */\n\n";
foreach my $d (@{$data}) {
($d->{TYPE} eq "FUNCTION") &&
ParseFunction($interface, $d);
Modified: branches/SAMBA_4_0/source/lib/dcom/classes/simple.c
===================================================================
--- branches/SAMBA_4_0/source/lib/dcom/classes/simple.c 2005-01-09 19:06:49 UTC (rev 4623)
+++ branches/SAMBA_4_0/source/lib/dcom/classes/simple.c 2005-01-09 21:35:37 UTC (rev 4624)
@@ -21,8 +21,26 @@
#include "includes.h"
#include "lib/dcom/common/dcom.h"
-static struct dcom_IClassFactory_vtable simple_classobject;
+NTSTATUS simple_QueryInterface (struct dcom_interface_p *d, TALLOC_CTX *mem_ctx, struct QueryInterface *r)
+{
+ return NT_STATUS_NOT_SUPPORTED;
+}
+static NTSTATUS simple_CreateInstance (struct dcom_interface_p *d, TALLOC_CTX *mem_ctx, struct CreateInstance *r)
+{
+ return NT_STATUS_NOT_SUPPORTED;
+}
+
+/* Everything below this line should be autogenerated later on */
+
+static struct dcom_IClassFactory_vtable simple_classobject = {
+ { simple_QueryInterface, NULL, NULL },
+ simple_CreateInstance,
+ NULL,
+ NULL,
+ NULL
+};
+
NTSTATUS dcom_simple_init(void)
{
struct GUID iid;
@@ -32,10 +50,17 @@
GUID_from_string(DCERPC_IUNKNOWN_UUID, &iid);
- simple_class.class_object = dcom_new_local_ifacep(talloc_autofree_context(),
- dcom_interface_by_iid(&iid),
+ simple_class.class_object = dcom_new_local_ifacep(
+ talloc_autofree_context(),
+ &iid,
&simple_classobject, NULL);
+ if (!simple_class.class_object) {
+ DEBUG(1, ("Unable to create class object for simple class\n"));
+ return NT_STATUS_FOOBAR;
+ }
+
GUID_from_string("5e9ddec7-5767-11cf-beab-00aa006c3606", &simple_class.clsid);
+
return dcom_register_class(&simple_class);
}
Modified: branches/SAMBA_4_0/source/lib/dcom/common/main.c
===================================================================
--- branches/SAMBA_4_0/source/lib/dcom/common/main.c 2005-01-09 19:06:49 UTC (rev 4623)
+++ branches/SAMBA_4_0/source/lib/dcom/common/main.c 2005-01-09 21:35:37 UTC (rev 4624)
@@ -549,10 +549,16 @@
return getpid();
}
-struct dcom_interface_p *dcom_new_local_ifacep(struct dcom_context *ctx, const struct dcom_interface *iface, void *vtable, struct dcom_object *object)
+struct dcom_interface_p *dcom_new_local_ifacep(struct dcom_context *ctx, const struct GUID *iid, void *vtable, struct dcom_object *object)
{
struct dcom_interface_p *ip = talloc_p(ctx, struct dcom_interface_p);
+ const struct dcom_interface *iface = dcom_interface_by_iid(iid);
+ if (!iface) {
+ DEBUG (1, ("Unable to find interface with IID %s\n", GUID_string(ctx, iid)));
+ return NULL;
+ }
+
ip->ctx = ctx;
ip->interface = iface;
ip->vtable = vtable;
Modified: branches/SAMBA_4_0/source/lib/dcom/common/tables.c
===================================================================
--- branches/SAMBA_4_0/source/lib/dcom/common/tables.c 2005-01-09 19:06:49 UTC (rev 4623)
+++ branches/SAMBA_4_0/source/lib/dcom/common/tables.c 2005-01-09 21:35:37 UTC (rev 4624)
@@ -77,7 +77,12 @@
{
const struct dcom_interface *iface = _iface;
struct interface_list *l;
+ TALLOC_CTX *lcl_ctx = talloc_init("dcom_register_interface");
+ DEBUG(5, ("Adding DCOM interface %s\n", GUID_string(lcl_ctx, &iface->iid)));
+
+ talloc_destroy(lcl_ctx);
+
l = talloc_zero_p(interfaces?interfaces:talloc_autofree_context(),
struct interface_list);
Modified: branches/SAMBA_4_0/source/lib/dcom/config.mk
===================================================================
--- branches/SAMBA_4_0/source/lib/dcom/config.mk 2005-01-09 19:06:49 UTC (rev 4623)
+++ branches/SAMBA_4_0/source/lib/dcom/config.mk 2005-01-09 21:35:37 UTC (rev 4624)
@@ -10,6 +10,7 @@
[MODULE::DCOM_SIMPLE]
SUBSYSTEM = LIBDCOM
+REQUIRED_SUBSYSTEMS = DCOM_PROXY_DCOM
INIT_FUNCTION = dcom_simple_init
INIT_OBJ_FILES = \
lib/dcom/classes/simple.o
Modified: branches/SAMBA_4_0/source/torture/dcom/simple.c
===================================================================
--- branches/SAMBA_4_0/source/torture/dcom/simple.c 2005-01-09 19:06:49 UTC (rev 4623)
+++ branches/SAMBA_4_0/source/torture/dcom/simple.c 2005-01-09 21:35:37 UTC (rev 4624)
@@ -26,11 +26,10 @@
#define CLSID_SIMPLE "5e9ddec7-5767-11cf-beab-00aa006c3606"
#define DEFAULT_TRANS 4096
-BOOL torture_dcom_simple(void)
+static BOOL test_readwrite(TALLOC_CTX *mem_ctx, const char *host)
{
NTSTATUS status;
struct dcerpc_pipe *p = NULL;
- TALLOC_CTX *mem_ctx;
BOOL ret = True;
struct GUID IID[2];
struct GUID clsid;
@@ -45,18 +44,15 @@
extern NTSTATUS dcom_IUnknown_init(void);
extern NTSTATUS dcom_IStream_init(void);
- mem_ctx = talloc_init("torture_dcom_simple");
-
torture_dcom_init(&ctx);
GUID_from_string(DCERPC_ISTREAM_UUID, &IID[0]);
GUID_from_string(DCERPC_IUNKNOWN_UUID, &IID[1]);
GUID_from_string(CLSID_SIMPLE, &clsid);
error = dcom_create_object(ctx, &clsid,
- lp_parm_string(-1, "torture", "dcomhost"), 2, IID,
+ host, 2, IID,
&interfaces,
results);
-
if (!W_ERROR_IS_OK(error)) {
printf("dcom_create_object failed - %s\n", win_errstr(error));
@@ -102,5 +98,17 @@
talloc_destroy(mem_ctx);
torture_rpc_close(p);
+
+ return True;
+}
+
+BOOL torture_dcom_simple(void)
+{
+ BOOL ret = True;
+ TALLOC_CTX *mem_ctx = talloc_init("torture_dcom_simple");
+
+ ret &= test_readwrite(mem_ctx, NULL);
+ ret &= test_readwrite(mem_ctx, lp_parm_string(-1, "torture", "dcomhost"));
+
return ret;
}
More information about the samba-cvs
mailing list