Zebediah Figura : rpcrt4: RpcServerUnregisterIf() with NULL ifspec shouldn 't unregister auto-listen interfaces.
Alexandre Julliard
julliard at winehq.org
Mon May 7 16:34:41 CDT 2018
Module: wine
Branch: master
Commit: 950b349885c99ed51a40dd36282fc3cdb5c16e80
URL: https://source.winehq.org/git/wine.git/?a=commit;h=950b349885c99ed51a40dd36282fc3cdb5c16e80
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Sat May 5 14:07:48 2018 -0500
rpcrt4: RpcServerUnregisterIf() with NULL ifspec shouldn't unregister auto-listen interfaces.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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)
{
More information about the wine-cvs
mailing list