From 83537916f8e2c61161f06dc84dd21972bb65b5eb Mon Sep 17 00:00:00 2001 From: Matthew Metnetsky Date: Thu, 26 Jul 2012 13:52:38 -0400 Subject: [PATCH] Fix issue 335 By assigning a SECURITY_DESCRIPTOR to the event we gain the ability to share it between service and console programs. We also added EVENT_MODIFY_STATE as a requirement to OpenEvent so we can SetEvent later in the method. --- src/signaler.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/signaler.cpp b/src/signaler.cpp index a9be343e..bd59d819 100644 --- a/src/signaler.cpp +++ b/src/signaler.cpp @@ -233,6 +233,14 @@ int zmq::signaler_t::make_fdpair (fd_t *r_, fd_t *w_) return 0; #elif defined ZMQ_HAVE_WINDOWS + SECURITY_DESCRIPTOR sd = {0}; + SECURITY_ATTRIBUTES sa = {0}; + + InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); + SetSecurityDescriptorDacl(&sd, TRUE, 0, FALSE); + + sa.nLength = sizeof(SECURITY_ATTRIBUTES); + sa.lpSecurityDescriptor = &sd; // This function has to be in a system-wide critical section so that // two instances of the library don't accidentally create signaler @@ -241,9 +249,9 @@ int zmq::signaler_t::make_fdpair (fd_t *r_, fd_t *w_) // Note that if the event object already exists, the CreateEvent requests // EVENT_ALL_ACCESS access right. If this fails, we try to open // the event object asking for SYNCHRONIZE access only. - HANDLE sync = CreateEvent (NULL, FALSE, TRUE, TEXT ("zmq-signaler-port-sync")); + HANDLE sync = CreateEvent (&sa, FALSE, TRUE, TEXT ("zmq-signaler-port-sync")); if (sync == NULL && GetLastError () == ERROR_ACCESS_DENIED) - sync = OpenEvent (SYNCHRONIZE, FALSE, TEXT ("zmq-signaler-port-sync")); + sync = OpenEvent (SYNCHRONIZE | EVENT_MODIFY_STATE, FALSE, TEXT ("zmq-signaler-port-sync")); win_assert (sync != NULL);