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 | // Run run cmd | ||||||
| func (c *CheckAttributeReader) Run() error { | func (c *CheckAttributeReader) Run() error { | ||||||
| 	defer func() { | 	defer func() { | ||||||
| 		_ = c.Close() | 		_ = c.stdinReader.Close() | ||||||
|  | 		_ = c.stdOut.Close() | ||||||
| 	}() | 	}() | ||||||
| 	stdErr := new(bytes.Buffer) | 	stdErr := new(bytes.Buffer) | ||||||
| 	err := c.cmd.RunWithContext(&RunContext{ | 	err := c.cmd.RunWithContext(&RunContext{ | ||||||
| @@ -196,14 +197,17 @@ func (c *CheckAttributeReader) Run() error { | |||||||
| 		Stdout:  c.stdOut, | 		Stdout:  c.stdOut, | ||||||
| 		Stderr:  stdErr, | 		Stderr:  stdErr, | ||||||
| 		PipelineFunc: func(_ context.Context, _ context.CancelFunc) error { | 		PipelineFunc: func(_ context.Context, _ context.CancelFunc) error { | ||||||
|  | 			select { | ||||||
|  | 			case <-c.running: | ||||||
|  | 			default: | ||||||
| 				close(c.running) | 				close(c.running) | ||||||
|  | 			} | ||||||
| 			return nil | 			return nil | ||||||
| 		}, | 		}, | ||||||
| 	}) | 	}) | ||||||
| 	if err != nil && c.ctx.Err() != nil && err.Error() != "signal: killed" { | 	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 fmt.Errorf("failed to run attr-check. Error: %w\nStderr: %s", err, stdErr.String()) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -243,10 +247,8 @@ func (c *CheckAttributeReader) CheckPath(path string) (rs map[string]string, err | |||||||
|  |  | ||||||
| // Close close pip after use | // Close close pip after use | ||||||
| func (c *CheckAttributeReader) Close() error { | func (c *CheckAttributeReader) Close() error { | ||||||
| 	err := c.stdinWriter.Close() |  | ||||||
| 	_ = c.stdinReader.Close() |  | ||||||
| 	_ = c.stdOut.Close() |  | ||||||
| 	c.cancel() | 	c.cancel() | ||||||
|  | 	err := c.stdinWriter.Close() | ||||||
| 	select { | 	select { | ||||||
| 	case <-c.running: | 	case <-c.running: | ||||||
| 	default: | 	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() { | 			defer func() { | ||||||
|  | 				_ = checker.Close() | ||||||
| 				cancel() | 				cancel() | ||||||
| 			}() | 			}() | ||||||
| 		} | 		} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user