From 44e7fe2222be3b30066ce57c35dc52ceaf86908f Mon Sep 17 00:00:00 2001 From: Anton Berezhnyi Date: Wed, 15 Nov 2023 23:56:32 +0200 Subject: [PATCH 1/2] Fix issue with not closed file descriptor --- parser/parser.go | 13 ++++++++++++- parser/parser_test.go | 3 ++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/parser/parser.go b/parser/parser.go index 36bd0e2..c719b58 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -31,6 +31,7 @@ type Parser struct { blockWrappers map[string]func(*gonginx.Directive) gonginx.IDirective directiveWrappers map[string]func(*gonginx.Directive) gonginx.IDirective commentBuffer []string + file *os.File } // WithSameOptions copy options from another parser @@ -87,6 +88,7 @@ func NewParser(filePath string, opts ...Option) (*Parser, error) { l := newLexer(bufio.NewReader(f)) l.file = filePath p := NewParserFromLexer(l, opts...) + p.file = f return p, nil } @@ -152,10 +154,12 @@ func (p *Parser) followingTokenIs(t token.Type) bool { // Parse the gonginx. func (p *Parser) Parse() *gonginx.Config { - return &gonginx.Config{ + c := &gonginx.Config{ FilePath: p.lexer.file, //TODO: set filepath here, Block: p.parseBlock(), } + _ = p.Close() + return c } // ParseBlock parse a block statement @@ -345,3 +349,10 @@ func (p *Parser) wrapHTTP(directive *gonginx.Directive) *gonginx.HTTP { func (p *Parser) parseUpstreamServer(directive *gonginx.Directive) *gonginx.UpstreamServer { return gonginx.NewUpstreamServer(directive) } + +func (p *Parser) Close() (err error) { + if p.file != nil { + err = p.file.Close() + } + return err +} diff --git a/parser/parser_test.go b/parser/parser_test.go index 52a783b..92dd287 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -114,8 +114,9 @@ func TestParser_ParseUpstream(t *testing.T) { func TestParser_ParseFromFile(t *testing.T) { t.Parallel() - _, err := NewParser("../full-example/nginx.conf") + p, err := NewParser("../full-example/nginx.conf") assert.NilError(t, err) + assert.Assert(t, p.file != nil, "file must be non-nil") _, err2 := NewParser("../full-example/nginx.conf-not-found") assert.ErrorContains(t, err2, "no such file or directory") } From dac6549f32b975f9f8c4879accaa4d6f4bc616aa Mon Sep 17 00:00:00 2001 From: Anton Berezhnyi Date: Thu, 16 Nov 2023 10:51:21 +0200 Subject: [PATCH 2/2] Add comment (make happy github actions audit) --- parser/parser.go | 1 + 1 file changed, 1 insertion(+) diff --git a/parser/parser.go b/parser/parser.go index c719b58..65e6ea6 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -350,6 +350,7 @@ func (p *Parser) parseUpstreamServer(directive *gonginx.Directive) *gonginx.Upst return gonginx.NewUpstreamServer(directive) } +// Close closes the file handler and releases the resources func (p *Parser) Close() (err error) { if p.file != nil { err = p.file.Close()