mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 10:56:10 +01:00 
			
		
		
		
	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>
This commit is contained in:
		| @@ -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: | ||||
|   | ||||
| @@ -88,7 +88,10 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err | ||||
| 					} | ||||
| 				}() | ||||
| 			} | ||||
| 			defer cancel() | ||||
| 			defer func() { | ||||
| 				_ = checker.Close() | ||||
| 				cancel() | ||||
| 			}() | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -1422,6 +1422,7 @@ func GetDiff(gitRepo *git.Repository, opts *DiffOptions, files ...string) (*Diff | ||||
| 				}() | ||||
| 			} | ||||
| 			defer func() { | ||||
| 				_ = checker.Close() | ||||
| 				cancel() | ||||
| 			}() | ||||
| 		} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user