[PATCH 2/2] rpcrt4: RpcServerUnregisterIf() with NULL ifspec shouldn't unregister auto-listen interfaces.

Zebediah Figura z.figura12 at gmail.com
Sat May 5 14:07:48 CDT 2018


Fixes https://bugs.winehq.org/show_bug.cgi?id=45134.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/rpcrt4/rpc_server.c     |  3 ++-
 dlls/rpcrt4/tests/server.c   | 11 +++++++++++
 dlls/rpcrt4/tests/server.idl |  1 +
 3 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/dlls/rpcrt4/rpc_server.c b/dlls/rpcrt4/rpc_server.c
index d1b5d64..91de3b9 100644
--- a/dlls/rpcrt4/rpc_server.c
+++ b/dlls/rpcrt4/rpc_server.c
@@ -1220,7 +1220,8 @@ RPC_STATUS WINAPI RpcServerUnregisterIf( RPC_IF_HANDLE IfSpec, UUID* MgrTypeUuid
 
   EnterCriticalSection(&server_cs);
   LIST_FOR_EACH_ENTRY(cif, &server_interfaces, RpcServerInterface, entry) {
-    if ((!IfSpec || !memcmp(&If->InterfaceId, &cif->If->InterfaceId, sizeof(RPC_SYNTAX_IDENTIFIER))) &&
+    if (((!IfSpec && !(cif->Flags & RPC_IF_AUTOLISTEN)) ||
+        (IfSpec && !memcmp(&If->InterfaceId, &cif->If->InterfaceId, sizeof(RPC_SYNTAX_IDENTIFIER)))) &&
         UuidEqual(MgrTypeUuid, &cif->MgrTypeUuid, &status)) {
       list_remove(&cif->entry);
       TRACE("unregistering cif %p\n", cif);
diff --git a/dlls/rpcrt4/tests/server.c b/dlls/rpcrt4/tests/server.c
index 5a61181..dfad1ed 100644
--- a/dlls/rpcrt4/tests/server.c
+++ b/dlls/rpcrt4/tests/server.c
@@ -844,6 +844,14 @@ void __cdecl s_stop(void)
   }
 }
 
+void __cdecl s_stop_autolisten(void)
+{
+    RPC_STATUS status;
+    status = RpcServerUnregisterIf(NULL, NULL, FALSE);
+todo_wine
+    ok(status == RPC_S_UNKNOWN_MGR_TYPE, "got %u\n", status);
+}
+
 void __cdecl s_ip_test(ipu_t *a)
 {
     STATSTG st;
@@ -1690,6 +1698,9 @@ client(const char *test)
 todo_wine
     test_is_server_listening(IServer_IfHandle, RPC_S_NOT_LISTENING);
 
+    stop_autolisten();
+    ok(int_return() == INT_CODE, "RPC int_return\n");
+
     ok(RPC_S_OK == RpcStringFreeA(&binding), "RpcStringFree\n");
     ok(RPC_S_OK == RpcBindingFree(&IServer_IfHandle), "RpcBindingFree\n");
   }
diff --git a/dlls/rpcrt4/tests/server.idl b/dlls/rpcrt4/tests/server.idl
index 75d78f7..6aa7382 100644
--- a/dlls/rpcrt4/tests/server.idl
+++ b/dlls/rpcrt4/tests/server.idl
@@ -385,6 +385,7 @@ cpp_quote("#endif")
   void authinfo_test(unsigned int protseq, int secure);
 
   void stop(void);
+  void stop_autolisten(void);
 
   typedef union ipu switch(int t)
   {
-- 
2.7.4




More information about the wine-devel mailing list