summaryrefslogtreecommitdiffhomepage
path: root/src/daemon/ntapi_dsr_internal_connection.c
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2017-01-06 19:20:23 -0500
committermidipix <writeonce@midipix.org>2017-01-07 09:02:37 -0500
commita5dc9f23b94eddb634e915f600bc928b3e6ed316 (patch)
tree2bc6879c976a1d9394b64678cb1c0a021462dbf8 /src/daemon/ntapi_dsr_internal_connection.c
parent6336c42970e39d7cc76071a93e7058ba3d8fda3e (diff)
downloadntapi-a5dc9f23b94eddb634e915f600bc928b3e6ed316.tar.bz2
ntapi-a5dc9f23b94eddb634e915f600bc928b3e6ed316.tar.xz
daemon initialization: simplified logic, fixed params-related race hazard.
Diffstat (limited to 'src/daemon/ntapi_dsr_internal_connection.c')
-rw-r--r--src/daemon/ntapi_dsr_internal_connection.c62
1 files changed, 30 insertions, 32 deletions
diff --git a/src/daemon/ntapi_dsr_internal_connection.c b/src/daemon/ntapi_dsr_internal_connection.c
index 7246eff..2d6e39f 100644
--- a/src/daemon/ntapi_dsr_internal_connection.c
+++ b/src/daemon/ntapi_dsr_internal_connection.c
@@ -12,23 +12,7 @@
#include <ntapi/ntapi.h>
#include "ntapi_impl.h"
-static int32_t __stdcall __ntapi_dsr_connect_internal_client_exit(
- nt_daemon_params * params,
- int32_t status)
-{
- at_store_32(
- &params->exit_code_daemon_start,
- status);
-
- if (status == NT_STATUS_SUCCESS)
- at_store_32(
- &params->exit_code_daemon_loop,
- NT_STATUS_SERVICE_NOTIFICATION);
-
- return status;
-}
-
-static int32_t __stdcall __ntapi_dsr_internal_client_connect_exit(
+static int32_t __stdcall __ntapi_dsr_internal_client_connect_fail(
nt_daemon_params * params,
int32_t status)
{
@@ -48,7 +32,11 @@ int32_t __stdcall __ntapi_dsr_connect_internal_client(nt_daemon_params * params)
intptr_t port_id;
nt_port_message port_msg;
nt_large_integer timeout;
- void * _hport_client;
+ void * hport;
+ void * hready;
+
+ /* avoid out-of-scope use */
+ hready = params->hthread_internal_client;
/* report state */
at_store_32(
@@ -64,8 +52,7 @@ int32_t __stdcall __ntapi_dsr_connect_internal_client(nt_daemon_params * params)
(nt_port_message *)0,
(nt_port_message *)&port_msg,
&timeout)))
- return __ntapi_dsr_connect_internal_client_exit(
- params,status);
+ return status;
/* the internal client must be first */
if (port_msg.client_id.process_id != pe_get_current_process_id())
@@ -73,21 +60,24 @@ int32_t __stdcall __ntapi_dsr_connect_internal_client(nt_daemon_params * params)
/* accept connection request */
if ((status = __ntapi->zw_accept_connect_port(
- &_hport_client,
+ &hport,
port_msg.client_id.process_id,
(nt_port_message *)&port_msg,
NT_LPC_ACCEPT_CONNECTION,
(nt_port_section_write *)0,
(nt_port_section_read *)0)))
- return __ntapi_dsr_connect_internal_client_exit(
- params,status);
+ return status;
/* finalize connection */
- status = __ntapi->zw_complete_connect_port(
- _hport_client);
+ if ((status = __ntapi->zw_complete_connect_port(hport)))
+ return status;
+
+ /* await client thread task completion */
+ __ntapi->zw_wait_for_single_object(
+ hready,NT_SYNC_NON_ALERTABLE,0);
- return __ntapi_dsr_connect_internal_client_exit(
- params,status);
+ /* all done */
+ return NT_STATUS_SUCCESS;
}
@@ -129,12 +119,19 @@ int32_t __stdcall __ntapi_dsr_internal_client_connect(nt_daemon_params * params)
&server_name,
&sqos,
0,0,0,0,0)))
- return __ntapi_dsr_internal_client_connect_exit(
+ return __ntapi_dsr_internal_client_connect_fail(
params,status);
- /* return port info */
+ /* update port info */
if (params->pport_internal_client)
- *(params->pport_internal_client) = params->hport_internal_client;
+ at_store(
+ (intptr_t *)params->pport_internal_client,
+ (intptr_t)params->hport_internal_client);
+
+ /* report status */
+ at_store_32(
+ &params->exit_code_internal_client,
+ status);
/* signal the 'internal-client-is-ready' event */
status = __ntapi->zw_set_event(
@@ -142,6 +139,7 @@ int32_t __stdcall __ntapi_dsr_internal_client_connect(nt_daemon_params * params)
0);
/* exit the task-specific thread */
- return __ntapi_dsr_internal_client_connect_exit(
- params,status);
+ return __ntapi->zw_terminate_thread(
+ NT_CURRENT_THREAD_HANDLE,
+ status);
}