diff options
Diffstat (limited to 'winsup/cygserver')
-rw-r--r-- | winsup/cygserver/shm.cc | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/winsup/cygserver/shm.cc b/winsup/cygserver/shm.cc index de3e61e4e..50ca42e0e 100644 --- a/winsup/cygserver/shm.cc +++ b/winsup/cygserver/shm.cc @@ -290,6 +290,26 @@ client_request_shm::serve (transport_layer_base * conn, process_cache * cache) return; } + /* Someone detached */ + if (parameters.in.type == SHM_DETACH) + { + shmnode *tempnode = shm_head; + while (tempnode) + { + if (tempnode->shm_id == parameters.in.shm_id) + { + InterlockedDecrement (&tempnode->shmds->shm_nattch); + header.error_code = 0; + CloseHandle (token_handle); + return; + } + tempnode = tempnode->next; + } + header.error_code = EINVAL; + CloseHandle (token_handle); + return; + } + /* Someone wants the ID removed. */ if (parameters.in.type == SHM_DEL) { |