From 332b2ecd214a79b49f3798f4f27fe02b23a17bf8 Mon Sep 17 00:00:00 2001 From: zeripath Date: Thu, 28 Apr 2022 04:19:33 +0100 Subject: [PATCH] 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 Co-authored-by: Lunny Xiao Co-authored-by: 6543 <6543@obermui.de> --- modules/git/repo_attribute.go | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/modules/git/repo_attribute.go b/modules/git/repo_attribute.go index 6481474a9..a18c80c3f 100644 --- a/modules/git/repo_attribute.go +++ b/modules/git/repo_attribute.go @@ -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 }