svn commit: samba r18566 - in branches/SAMBA_4_0/source: librpc/idl rpc_server/winreg torture/rpc

tridge at samba.org tridge at samba.org
Fri Sep 15 20:36:38 GMT 2006


Author: tridge
Date: 2006-09-15 20:36:38 +0000 (Fri, 15 Sep 2006)
New Revision: 18566

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=18566

Log:

fixed the winreg pipe and winreg tests

Jerry, there is a big difference on the wire between these two:

  [out] uint32 x;
and
  [out] uint32 *x;

if you change from 

  [out] uint32 x;

then you need to change to:

  [out,ref] uint32 *x;

otherwise it changes the format on the wire, which means we are no
longer compatible with MS servers.

but be aware that even if you change to a ref ptr, you also need to
change all the client code to set all the return variables in the out
part of the structure. That's why I don't like the MIDL restriction of
forcing the use of ref pointers for output variables - it makes life
much harder when writing client code, and makes the code much more
error prone (just look at all the extra code needed to make this work
again).

I know we could auto-allocate these variables in the generated client
side NDR code, but if we did that then we would have no way of doing a
_real_ ref out pointer, which we really wanted to set to some already
allocated variable.

So please hold off on changing our idl to use the MIDL convention for
output variables until Jelmer and I have had a good "chat" about this :-)

Modified:
   branches/SAMBA_4_0/source/librpc/idl/winreg.idl
   branches/SAMBA_4_0/source/rpc_server/winreg/rpc_winreg.c
   branches/SAMBA_4_0/source/torture/rpc/winreg.c


Changeset:
Modified: branches/SAMBA_4_0/source/librpc/idl/winreg.idl
===================================================================
--- branches/SAMBA_4_0/source/librpc/idl/winreg.idl	2006-09-15 20:07:55 UTC (rev 18565)
+++ branches/SAMBA_4_0/source/librpc/idl/winreg.idl	2006-09-15 20:36:38 UTC (rev 18566)
@@ -211,14 +211,14 @@
 		[in,ref] policy_handle *handle,
 		[in] winreg_String class_in,
 		[out] winreg_String *class_out,
-		[out] uint32 *num_subkeys,
-		[out] uint32 *max_subkeylen,
-		[out] uint32 *max_subkeysize,
-		[out] uint32 *num_values,
-		[out] uint32 *max_valnamelen,
-		[out] uint32 *max_valbufsize,
-		[out] uint32 *secdescsize,
-		[out] NTTIME *last_changed_time
+		[out,ref] uint32 *num_subkeys,
+		[out,ref] uint32 *max_subkeylen,
+		[out,ref] uint32 *max_subkeysize,
+		[out,ref] uint32 *num_values,
+		[out,ref] uint32 *max_valnamelen,
+		[out,ref] uint32 *max_valbufsize,
+		[out,ref] uint32 *secdescsize,
+		[out,ref] NTTIME *last_changed_time
 	);
 
 	/******************/
@@ -289,8 +289,8 @@
 	/******************/
 	/* Function: 0x1a */
 	WERROR winreg_GetVersion(
-		[in,ref] policy_handle *handle,
-		[out]    uint32 *version
+		[in,ref]     policy_handle *handle,
+		[out,ref]    uint32 *version
 	);
 
 	/******************/

Modified: branches/SAMBA_4_0/source/rpc_server/winreg/rpc_winreg.c
===================================================================
--- branches/SAMBA_4_0/source/rpc_server/winreg/rpc_winreg.c	2006-09-15 20:07:55 UTC (rev 18565)
+++ branches/SAMBA_4_0/source/rpc_server/winreg/rpc_winreg.c	2006-09-15 20:36:38 UTC (rev 18566)
@@ -523,7 +523,11 @@
 
 	DCESRV_PULL_HANDLE_FAULT(h, r->in.handle, HTYPE_REGKEY);
 
+	r->out.version = talloc(mem_ctx, uint32_t);
+	NT_STATUS_HAVE_NO_MEMORY(r->out.version);
+
 	*r->out.version = 5;
+
 	return WERR_OK;
 }
 

Modified: branches/SAMBA_4_0/source/torture/rpc/winreg.c
===================================================================
--- branches/SAMBA_4_0/source/torture/rpc/winreg.c	2006-09-15 20:07:55 UTC (rev 18565)
+++ branches/SAMBA_4_0/source/torture/rpc/winreg.c	2006-09-15 20:36:38 UTC (rev 18566)
@@ -54,10 +54,12 @@
 {
 	NTSTATUS status;
 	struct winreg_GetVersion r;
-
+	uint32_t v;
 	printf("\ntesting GetVersion\n");
 
+	ZERO_STRUCT(r);
 	r.in.handle = handle;
+	r.out.version = &v;
 
 	status = dcerpc_winreg_GetVersion(p, mem_ctx, &r);
 
@@ -372,10 +374,24 @@
 {
 	NTSTATUS status;
 	struct winreg_QueryInfoKey r;
+	uint32_t num_subkeys, max_subkeylen, max_subkeysize,
+		num_values, max_valnamelen, max_valbufsize,
+		secdescsize;
+	NTTIME last_changed_time;
 
 	printf("\ntesting QueryInfoKey\n");
 
+	ZERO_STRUCT(r);
 	r.in.handle = handle;
+	r.out.num_subkeys = &num_subkeys;
+	r.out.max_subkeylen = &max_subkeylen;
+	r.out.max_subkeysize = &max_subkeysize;
+	r.out.num_values = &num_values;
+	r.out.max_valnamelen = &max_valnamelen;
+	r.out.max_valbufsize = &max_valbufsize;
+	r.out.secdescsize = &secdescsize;
+	r.out.last_changed_time = &last_changed_time;
+	
 	init_winreg_String(&r.in.class_in, class);
 	
 	status = dcerpc_winreg_QueryInfoKey(p, mem_ctx, &r);



More information about the samba-cvs mailing list