diff options
author | zeripath <art27@cantab.net> | 2022-02-14 17:03:56 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-14 18:03:56 +0100 |
commit | 4482f62a26b5f66c1223b469b245ef8d65bae81a (patch) | |
tree | bd848527185e69855d4500c6a65a0c230764e187 /modules | |
parent | 5348e198db6cd84467c99d6741715291b33598a1 (diff) | |
download | gitea-4482f62a26b5f66c1223b469b245ef8d65bae81a.tar.gz gitea-4482f62a26b5f66c1223b469b245ef8d65bae81a.zip |
Prevent dangling GetAttribute calls (#18754)
It appears possible that there could be a hang due to unread data from the
repo-attribute command pipes. This PR simply closes these during the defer.
Signed-off-by: Andrew Thornton <art27@cantab.net>
Diffstat (limited to 'modules')
-rw-r--r-- | modules/git/repo_attribute.go | 14 | ||||
-rw-r--r-- | modules/git/repo_language_stats_nogogit.go | 5 |
2 files changed, 12 insertions, 7 deletions
diff --git a/modules/git/repo_attribute.go b/modules/git/repo_attribute.go index d31203aabd..772ee6ad12 100644 --- a/modules/git/repo_attribute.go +++ b/modules/git/repo_attribute.go @@ -185,7 +185,8 @@ func (c *CheckAttributeReader) Init(ctx context.Context) error { // Run run cmd func (c *CheckAttributeReader) Run() error { defer func() { - _ = c.Close() + _ = c.stdinReader.Close() + _ = c.stdOut.Close() }() stdErr := new(bytes.Buffer) err := c.cmd.RunWithContext(&RunContext{ @@ -196,14 +197,17 @@ func (c *CheckAttributeReader) Run() error { Stdout: c.stdOut, Stderr: stdErr, PipelineFunc: func(_ context.Context, _ context.CancelFunc) error { - close(c.running) + select { + case <-c.running: + default: + close(c.running) + } return nil }, }) if err != nil && c.ctx.Err() != nil && err.Error() != "signal: killed" { return fmt.Errorf("failed to run attr-check. Error: %w\nStderr: %s", err, stdErr.String()) } - return nil } @@ -243,10 +247,8 @@ func (c *CheckAttributeReader) CheckPath(path string) (rs map[string]string, err // Close close pip after use func (c *CheckAttributeReader) Close() error { - err := c.stdinWriter.Close() - _ = c.stdinReader.Close() - _ = c.stdOut.Close() c.cancel() + err := c.stdinWriter.Close() select { case <-c.running: default: diff --git a/modules/git/repo_language_stats_nogogit.go b/modules/git/repo_language_stats_nogogit.go index 0b21bf6344..adb11dd8fa 100644 --- a/modules/git/repo_language_stats_nogogit.go +++ b/modules/git/repo_language_stats_nogogit.go @@ -88,7 +88,10 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err } }() } - defer cancel() + defer func() { + _ = checker.Close() + cancel() + }() } } |