Prevent dangling cat-file calls (goroutine alternative) (#19454)
If an `os/exec.Command` is passed non `*os.File` as an input/output, go will create `os.Pipe`s and wait for their closure in `cmd.Wait()`. If the code following this is responsible for closing `io.Pipe`s or other handlers then on process death from context cancellation the `Wait` can hang. There are two possible solutions: 1. use `os.Pipe` as the input/output as `cmd.Wait` does not wait for these. 2. create a goroutine waiting on the context cancellation that will close the inputs. This PR provides the second option - which is a simpler change that can be more easily backported. Closes #19448 Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
		
							parent
							
								
									0dfc2e55ea
								
							
						
					
					
						commit
						0dcc74a8a7
					
				
					 1 changed files with 12 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -57,6 +57,12 @@ func CatFileBatchCheck(ctx context.Context, repoPath string) (WriteCloserError,
 | 
			
		|||
		<-closed
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Ensure cancel is called as soon as the provided context is cancelled
 | 
			
		||||
	go func() {
 | 
			
		||||
		<-ctx.Done()
 | 
			
		||||
		cancel()
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	_, filename, line, _ := runtime.Caller(2)
 | 
			
		||||
	filename = strings.TrimPrefix(filename, callerPrefix)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -101,6 +107,12 @@ func CatFileBatch(ctx context.Context, repoPath string) (WriteCloserError, *bufi
 | 
			
		|||
		<-closed
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Ensure cancel is called as soon as the provided context is cancelled
 | 
			
		||||
	go func() {
 | 
			
		||||
		<-ctx.Done()
 | 
			
		||||
		cancel()
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	_, filename, line, _ := runtime.Caller(2)
 | 
			
		||||
	filename = strings.TrimPrefix(filename, callerPrefix)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue