Cygwin: FIFO: Revert "take ownership on exec"
This reverts commit 39a9cd9465.
There is no need to explicitly take ownership in fixup_after_exec; if
ownership transfer is needed, it will be taken care of by
fhandler_fifo::close when the parent closes.  Moreover, closing the
parent's fifo_reader_thread can cause problems, such as the one
reported here:
  https://cygwin.com/pipermail/cygwin-patches/2020q2/010235.html
			
			
This commit is contained in:
		| @@ -1443,7 +1443,7 @@ class fhandler_fifo: public fhandler_base | |||||||
|   { return shmem->get_shared_fc_handler_committed (); } |   { return shmem->get_shared_fc_handler_committed (); } | ||||||
|   void set_shared_fc_handler_committed (size_t n) |   void set_shared_fc_handler_committed (size_t n) | ||||||
|   { shmem->set_shared_fc_handler_committed (n); } |   { shmem->set_shared_fc_handler_committed (n); } | ||||||
|   int update_my_handlers (bool from_exec = false); |   int update_my_handlers (); | ||||||
|   int update_shared_handlers (); |   int update_shared_handlers (); | ||||||
|   bool shared_fc_handler_updated () const |   bool shared_fc_handler_updated () const | ||||||
|   { return shmem->shared_fc_handler_updated (); } |   { return shmem->shared_fc_handler_updated (); } | ||||||
|   | |||||||
| @@ -118,14 +118,13 @@ sec_user_cloexec (bool cloexec, PSECURITY_ATTRIBUTES sa, PSID sid) | |||||||
| } | } | ||||||
|  |  | ||||||
| static HANDLE | static HANDLE | ||||||
| create_event (bool inherit = false) | create_event () | ||||||
| { | { | ||||||
|   NTSTATUS status; |   NTSTATUS status; | ||||||
|   OBJECT_ATTRIBUTES attr; |   OBJECT_ATTRIBUTES attr; | ||||||
|   HANDLE evt = NULL; |   HANDLE evt = NULL; | ||||||
|  |  | ||||||
|   InitializeObjectAttributes (&attr, NULL, inherit ? OBJ_INHERIT : 0, |   InitializeObjectAttributes (&attr, NULL, 0, NULL, NULL); | ||||||
| 			      NULL, NULL); |  | ||||||
|   status = NtCreateEvent (&evt, EVENT_ALL_ACCESS, &attr, |   status = NtCreateEvent (&evt, EVENT_ALL_ACCESS, &attr, | ||||||
| 			  NotificationEvent, FALSE); | 			  NotificationEvent, FALSE); | ||||||
|   if (!NT_SUCCESS (status)) |   if (!NT_SUCCESS (status)) | ||||||
| @@ -368,33 +367,9 @@ fhandler_fifo::record_connection (fifo_client_handler& fc, | |||||||
|   set_pipe_non_blocking (fc.h, true); |   set_pipe_non_blocking (fc.h, true); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Called from fifo_reader_thread_func with owner_lock in place, also | /* Called from fifo_reader_thread_func with owner_lock in place. */ | ||||||
|    from fixup_after_exec with shared handles useable as they are. */ |  | ||||||
| int | int | ||||||
| fhandler_fifo::update_my_handlers (bool from_exec) | fhandler_fifo::update_my_handlers () | ||||||
| { |  | ||||||
|   if (from_exec) |  | ||||||
|     { |  | ||||||
|       nhandlers = get_shared_nhandlers (); |  | ||||||
|       if (nhandlers > shandlers) |  | ||||||
| 	{ |  | ||||||
| 	  int save = shandlers; |  | ||||||
| 	  shandlers = nhandlers + 64; |  | ||||||
| 	  void *temp = realloc (fc_handler, |  | ||||||
| 				shandlers * sizeof (fc_handler[0])); |  | ||||||
| 	  if (!temp) |  | ||||||
| 	    { |  | ||||||
| 	      shandlers = save; |  | ||||||
| 	      nhandlers = 0; |  | ||||||
| 	      set_errno (ENOMEM); |  | ||||||
| 	      return -1; |  | ||||||
| 	    } |  | ||||||
| 	  fc_handler = (fifo_client_handler *) temp; |  | ||||||
| 	} |  | ||||||
|       memcpy (fc_handler, shared_fc_handler, |  | ||||||
| 	      nhandlers * sizeof (fc_handler[0])); |  | ||||||
|     } |  | ||||||
|   else |  | ||||||
| { | { | ||||||
|   close_all_handlers (); |   close_all_handlers (); | ||||||
|   fifo_reader_id_t prev = get_prev_owner (); |   fifo_reader_id_t prev = get_prev_owner (); | ||||||
| @@ -431,7 +406,6 @@ fhandler_fifo::update_my_handlers (bool from_exec) | |||||||
| 	} | 	} | ||||||
|       fc.state = shared_fc_handler[i].state; |       fc.state = shared_fc_handler[i].state; | ||||||
|     } |     } | ||||||
|     } |  | ||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -918,10 +892,9 @@ fhandler_fifo::open (int flags, mode_t) | |||||||
| 	  __seterrno (); | 	  __seterrno (); | ||||||
| 	  goto err_close_check_write_ready_evt; | 	  goto err_close_check_write_ready_evt; | ||||||
| 	} | 	} | ||||||
|       /* Make cancel and sync inheritable for exec. */ |       if (!(cancel_evt = create_event ())) | ||||||
|       if (!(cancel_evt = create_event (true))) |  | ||||||
| 	goto err_close_write_ready_ok_evt; | 	goto err_close_write_ready_ok_evt; | ||||||
|       if (!(thr_sync_evt = create_event (true))) |       if (!(thr_sync_evt = create_event ())) | ||||||
| 	goto err_close_cancel_evt; | 	goto err_close_cancel_evt; | ||||||
|       me.winpid = GetCurrentProcessId (); |       me.winpid = GetCurrentProcessId (); | ||||||
|       me.fh = this; |       me.fh = this; | ||||||
| @@ -1626,9 +1599,9 @@ fhandler_fifo::dup (fhandler_base *child, int flags) | |||||||
| 	  __seterrno (); | 	  __seterrno (); | ||||||
| 	  goto err_close_check_write_ready_evt; | 	  goto err_close_check_write_ready_evt; | ||||||
| 	} | 	} | ||||||
|       if (!(fhf->cancel_evt = create_event (true))) |       if (!(fhf->cancel_evt = create_event ())) | ||||||
| 	goto err_close_write_ready_ok_evt; | 	goto err_close_write_ready_ok_evt; | ||||||
|       if (!(fhf->thr_sync_evt = create_event (true))) |       if (!(fhf->thr_sync_evt = create_event ())) | ||||||
| 	goto err_close_cancel_evt; | 	goto err_close_cancel_evt; | ||||||
|       inc_nreaders (); |       inc_nreaders (); | ||||||
|       fhf->me.fh = fhf; |       fhf->me.fh = fhf; | ||||||
| @@ -1692,17 +1665,9 @@ fhandler_fifo::fixup_after_fork (HANDLE parent) | |||||||
| 	/* Prevent a later attempt to close the non-inherited | 	/* Prevent a later attempt to close the non-inherited | ||||||
| 	   pipe-instance handles copied from the parent. */ | 	   pipe-instance handles copied from the parent. */ | ||||||
| 	nhandlers = 0; | 	nhandlers = 0; | ||||||
|       else |       if (!(cancel_evt = create_event ())) | ||||||
| 	{ |  | ||||||
| 	  /* Close inherited handles needed only by exec. */ |  | ||||||
| 	  if (cancel_evt) |  | ||||||
| 	    NtClose (cancel_evt); |  | ||||||
| 	  if (thr_sync_evt) |  | ||||||
| 	    NtClose (thr_sync_evt); |  | ||||||
| 	} |  | ||||||
|       if (!(cancel_evt = create_event (true))) |  | ||||||
| 	api_fatal ("Can't create reader thread cancel event during fork, %E"); | 	api_fatal ("Can't create reader thread cancel event during fork, %E"); | ||||||
|       if (!(thr_sync_evt = create_event (true))) |       if (!(thr_sync_evt = create_event ())) | ||||||
| 	api_fatal ("Can't create reader thread sync event during fork, %E"); | 	api_fatal ("Can't create reader thread sync event during fork, %E"); | ||||||
|       inc_nreaders (); |       inc_nreaders (); | ||||||
|       me.winpid = GetCurrentProcessId (); |       me.winpid = GetCurrentProcessId (); | ||||||
| @@ -1725,36 +1690,14 @@ fhandler_fifo::fixup_after_exec () | |||||||
| 	api_fatal ("Can't reopen shared fc_handler memory during exec, %E"); | 	api_fatal ("Can't reopen shared fc_handler memory during exec, %E"); | ||||||
|       fc_handler = NULL; |       fc_handler = NULL; | ||||||
|       nhandlers = shandlers = 0; |       nhandlers = shandlers = 0; | ||||||
|  |       if (!(cancel_evt = create_event ())) | ||||||
|       /* Cancel parent's reader thread */ |  | ||||||
|       if (cancel_evt) |  | ||||||
| 	SetEvent (cancel_evt); |  | ||||||
|       if (thr_sync_evt) |  | ||||||
| 	WaitForSingleObject (thr_sync_evt, INFINITE); |  | ||||||
|  |  | ||||||
|       /* Take ownership if parent is owner. */ |  | ||||||
|       fifo_reader_id_t parent_fr = me; |  | ||||||
|       me.winpid = GetCurrentProcessId (); |  | ||||||
|       owner_lock (); |  | ||||||
|       if (get_owner () == parent_fr) |  | ||||||
| 	{ |  | ||||||
| 	  set_owner (me); |  | ||||||
| 	  if (update_my_handlers (true) < 0) |  | ||||||
| 	    api_fatal ("Can't update my handlers, %E"); |  | ||||||
| 	} |  | ||||||
|       owner_unlock (); |  | ||||||
|       /* Close inherited cancel_evt and thr_sync_evt. */ |  | ||||||
|       if (cancel_evt) |  | ||||||
| 	NtClose (cancel_evt); |  | ||||||
|       if (thr_sync_evt) |  | ||||||
| 	NtClose (thr_sync_evt); |  | ||||||
|       if (!(cancel_evt = create_event (true))) |  | ||||||
| 	api_fatal ("Can't create reader thread cancel event during exec, %E"); | 	api_fatal ("Can't create reader thread cancel event during exec, %E"); | ||||||
|       if (!(thr_sync_evt = create_event (true))) |       if (!(thr_sync_evt = create_event ())) | ||||||
| 	api_fatal ("Can't create reader thread sync event during exec, %E"); | 	api_fatal ("Can't create reader thread sync event during exec, %E"); | ||||||
|       /* At this moment we're a new reader.  The count will be |       /* At this moment we're a new reader.  The count will be | ||||||
| 	 decremented when the parent closes. */ | 	 decremented when the parent closes. */ | ||||||
|       inc_nreaders (); |       inc_nreaders (); | ||||||
|  |       me.winpid = GetCurrentProcessId (); | ||||||
|       new cygthread (fifo_reader_thread, this, "fifo_reader", thr_sync_evt); |       new cygthread (fifo_reader_thread, this, "fifo_reader", thr_sync_evt); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -1773,8 +1716,6 @@ fhandler_fifo::set_close_on_exec (bool val) | |||||||
|       set_no_inheritance (update_needed_evt, val); |       set_no_inheritance (update_needed_evt, val); | ||||||
|       set_no_inheritance (check_write_ready_evt, val); |       set_no_inheritance (check_write_ready_evt, val); | ||||||
|       set_no_inheritance (write_ready_ok_evt, val); |       set_no_inheritance (write_ready_ok_evt, val); | ||||||
|       set_no_inheritance (cancel_evt, val); |  | ||||||
|       set_no_inheritance (thr_sync_evt, val); |  | ||||||
|       fifo_client_lock (); |       fifo_client_lock (); | ||||||
|       for (int i = 0; i < nhandlers; i++) |       for (int i = 0; i < nhandlers; i++) | ||||||
| 	set_no_inheritance (fc_handler[i].h, val); | 	set_no_inheritance (fc_handler[i].h, val); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user