[PATCH] rpcrt4/tests: Add some tests for allocation of output parameters.

Zebediah Figura z.figura12 at gmail.com
Fri Apr 13 12:29:14 CDT 2018


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/rpcrt4/tests/server.c   | 67 ++++++++++++++++++++++++++++++++++++++++++--
 dlls/rpcrt4/tests/server.idl |  4 +++
 2 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/dlls/rpcrt4/tests/server.c b/dlls/rpcrt4/tests/server.c
index 5278a1d..e48d0c7 100644
--- a/dlls/rpcrt4/tests/server.c
+++ b/dlls/rpcrt4/tests/server.c
@@ -25,6 +25,7 @@
 #include <secext.h>
 #include <rpcdce.h>
 #include <netfw.h>
+#include "wine/heap.h"
 #include "wine/test.h"
 #include "server.h"
 #include "server_defines.h"
@@ -72,16 +73,20 @@ static void InitFunctionPointers(void)
     if (!pNDRSContextMarshall2) old_windows_version = TRUE;
 }
 
+static int locks;
+
 void __RPC_FAR *__RPC_USER
 midl_user_allocate(SIZE_T n)
 {
-  return HeapAlloc(GetProcessHeap(), 0, n);
+    locks++;
+    return heap_alloc(n);
 }
 
 void __RPC_USER
 midl_user_free(void __RPC_FAR *p)
 {
-  HeapFree(GetProcessHeap(), 0, p);
+    locks--;
+    ok(HeapFree(GetProcessHeap(), 0, p), "HeapFree(%p) failed\n", p);
 }
 
 static char *
@@ -853,6 +858,25 @@ void __cdecl s_ip_test(ipu_t *a)
     ok(hr == S_OK, "got %#x\n", hr);
 }
 
+void __cdecl s_get_pint(int **a)
+{
+    static int b = 12345;
+    *a = &b;
+}
+
+int *__cdecl s_ret_pint(void)
+{
+    int *ret = midl_user_allocate(sizeof(int));
+    *ret = 12345;
+    return ret;
+}
+
+void __cdecl s_get_str(str_t *a)
+{
+    *a = midl_user_allocate(5);
+    strcpy(*a, "wine");
+}
+
 static void
 make_cmdline(char buffer[MAX_PATH], const char *test)
 {
@@ -874,6 +898,8 @@ run_client(const char *test)
   winetest_wait_child_process( info.hProcess );
   ok(CloseHandle(info.hProcess), "CloseHandle\n");
   ok(CloseHandle(info.hThread), "CloseHandle\n");
+
+  ok(!locks, "got %d locks on server\n", locks);
 }
 
 static void
@@ -1242,6 +1268,9 @@ pointer_tests(void)
   int *pa2;
   s123_t *s123;
   int val = 42;
+  int *pint;
+  char buf[5];
+  str_t str;
 
   ok(test_list_length(list) == 3, "RPC test_list_length\n");
   ok(square_puint(p1) == 121, "RPC square_puint\n");
@@ -1335,6 +1364,37 @@ pointer_tests(void)
 
   full_pointer_test(&val, &val);
   full_pointer_null_test(&val, NULL);
+
+  /* A simple out pointer (base type or enum) should not be allocated on the
+   * server side, but still must be freed on the client side. */
+  pint = NULL;
+  get_pint(&pint);
+  ok(!!pint, "RPC get_pint\n");
+  ok(*pint == 12345, "got %d\n", *pint);
+  midl_user_free(pint);
+
+  pint = &val;
+  get_pint(&pint);
+  ok(pint == &val, "got %p\n", pint);
+  ok(*pint == 12345, "got %d\n", *pint);
+
+  /* Otherwise the pointer must be allocated on the server side and freed on
+   * the client side. */
+  pint = ret_pint();
+  ok(!!pint, "RPC ret_pint\n");
+  ok(*pint == 12345, "got %d\n", *pint);
+  midl_user_free(pint);
+
+  str = NULL;
+  get_str(&str);
+  ok(!!str, "RPC get_str\n");
+  ok(!strcmp(str, "wine"), "got %s\n", str);
+  midl_user_free(str);
+
+  str = buf;
+  get_str(&str);
+  ok(str == buf, "got %p\n", str);
+  ok(!strcmp(str, "wine"), "got %s\n", str);
 }
 
 static int
@@ -1446,6 +1506,7 @@ array_tests(void)
   ok(get_cpsc(5, &cpsc) == 45, "RPC sum_cpsc\n");
   ok( cpsc.a == 10, "RPC get_cpsc %u\n", cpsc.a );
   for (n = 0; n < 10; n++) ok( cpsc.ca[n] == n, "RPC get_cpsc[%d] = %d\n", n, cpsc.ca[n] );
+  midl_user_free(cpsc.ca);
 
   memset( tmp, 0x33, sizeof(tmp) );
   cpsc.ca = tmp;
@@ -1592,6 +1653,8 @@ run_tests(void)
   pointer_tests();
   array_tests();
   context_handle_test();
+
+  ok(!locks, "got %d locks on client\n", locks);
 }
 
 static void
diff --git a/dlls/rpcrt4/tests/server.idl b/dlls/rpcrt4/tests/server.idl
index 75d78f7..52f689e 100644
--- a/dlls/rpcrt4/tests/server.idl
+++ b/dlls/rpcrt4/tests/server.idl
@@ -392,4 +392,8 @@ cpp_quote("#endif")
   } ipu_t;
 
   void ip_test([in] ipu_t *a);
+
+  void get_pint([out] int **a);
+  int *ret_pint(void);
+  void get_str([out] str_t *out);
 }
-- 
2.7.4




More information about the wine-devel mailing list