mirror of git://sourceware.org/git/glibc.git
				
				
				
			Fix hang on fork
If e.g. a signal is being received while we are running fork(), the signal thread may be having our SS lock when we make the space copy, and thus in the child we can not take the SS lock any more. * sysdeps/mach/hurd/fork.c (__fork): Lock SS->lock around __proc_dostop call. Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
This commit is contained in:
		
							parent
							
								
									9570bc53fc
								
							
						
					
					
						commit
						17a62de1ff
					
				| 
						 | 
				
			
			@ -1,3 +1,8 @@
 | 
			
		|||
2014-08-28  Samuel Thibault  <samuel.thibault@ens-lyon.org>
 | 
			
		||||
 | 
			
		||||
	* sysdeps/mach/hurd/fork.c (__fork): Lock SS->lock around
 | 
			
		||||
	__proc_dostop call.
 | 
			
		||||
 | 
			
		||||
2014-08-27  Mark Wielaard  <mjw@redhat.com>
 | 
			
		||||
 | 
			
		||||
	[BZ #17319]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -129,9 +129,13 @@ __fork (void)
 | 
			
		|||
      ports_locked = 1;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      /* Keep our SS locked while stopping other threads, so they don't get a
 | 
			
		||||
         chance to have it locked in the copied space.  */
 | 
			
		||||
      __spin_lock (&ss->lock);
 | 
			
		||||
      /* Stop all other threads while copying the address space,
 | 
			
		||||
	 so nothing changes.  */
 | 
			
		||||
      err = __proc_dostop (_hurd_ports[INIT_PORT_PROC].port, ss->thread);
 | 
			
		||||
      __spin_unlock (&ss->lock);
 | 
			
		||||
      if (!err)
 | 
			
		||||
	{
 | 
			
		||||
	  stopped = 1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue