mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Prevent intermittent race in attribute reader close (#19537)
There is a potential rare race possible whereby the c.running channel could be closed twice. Looking at the code I do not see a need for this c.running channel and therefore I think we can remove this. (I think the c.running might have been some attempt to prevent a hang but the use of os.Pipes should prevent that.) Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: 6543 <6543@obermui.de>
This commit is contained in:
		@@ -124,12 +124,10 @@ type CheckAttributeReader struct {
 | 
			
		||||
	env         []string
 | 
			
		||||
	ctx         context.Context
 | 
			
		||||
	cancel      context.CancelFunc
 | 
			
		||||
	running     chan struct{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Init initializes the cmd
 | 
			
		||||
func (c *CheckAttributeReader) Init(ctx context.Context) error {
 | 
			
		||||
	c.running = make(chan struct{})
 | 
			
		||||
	cmdArgs := []string{"check-attr", "--stdin", "-z"}
 | 
			
		||||
 | 
			
		||||
	if len(c.IndexFile) > 0 && CheckGitVersionAtLeast("1.7.8") == nil {
 | 
			
		||||
@@ -194,14 +192,6 @@ func (c *CheckAttributeReader) Run() error {
 | 
			
		||||
		Stdin:  c.stdinReader,
 | 
			
		||||
		Stdout: c.stdOut,
 | 
			
		||||
		Stderr: stdErr,
 | 
			
		||||
		PipelineFunc: func(_ context.Context, _ context.CancelFunc) error {
 | 
			
		||||
			select {
 | 
			
		||||
			case <-c.running:
 | 
			
		||||
			default:
 | 
			
		||||
				close(c.running)
 | 
			
		||||
			}
 | 
			
		||||
			return nil
 | 
			
		||||
		},
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil && //                      If there is an error we need to return but:
 | 
			
		||||
		c.ctx.Err() != err && //             1. Ignore the context error if the context is cancelled or exceeds the deadline (RunWithContext could return c.ctx.Err() which is Canceled or DeadlineExceeded)
 | 
			
		||||
@@ -222,7 +212,7 @@ func (c *CheckAttributeReader) CheckPath(path string) (rs map[string]string, err
 | 
			
		||||
	select {
 | 
			
		||||
	case <-c.ctx.Done():
 | 
			
		||||
		return nil, c.ctx.Err()
 | 
			
		||||
	case <-c.running:
 | 
			
		||||
	default:
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if _, err = c.stdinWriter.Write([]byte(path + "\x00")); err != nil {
 | 
			
		||||
@@ -249,11 +239,6 @@ func (c *CheckAttributeReader) CheckPath(path string) (rs map[string]string, err
 | 
			
		||||
func (c *CheckAttributeReader) Close() error {
 | 
			
		||||
	c.cancel()
 | 
			
		||||
	err := c.stdinWriter.Close()
 | 
			
		||||
	select {
 | 
			
		||||
	case <-c.running:
 | 
			
		||||
	default:
 | 
			
		||||
		close(c.running)
 | 
			
		||||
	}
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user