From 9fabffc8806dd0f1e50ec4e5845d51830322d127 Mon Sep 17 00:00:00 2001 From: Dmitry Maluka Date: Sun, 10 Sep 2023 04:17:23 +0200 Subject: [PATCH] Fix issues with handling invalid regex in syntax files (#2913) * Fix panic due to invalid regex in a syntax file When a user's custom syntax file has a malformed filename regex or header regex, MakeHeaderYaml() returns error but we do not properly handle it, which results in a panic due to a dereference of the `header` pointer which is nil: Micro encountered an error: runtime.errorString runtime error: invalid memory address or nil pointer dereference runtime/panic.go:221 (0x44c367) runtime/panic.go:220 (0x44c337) github.com/zyedidia/micro/v2/internal/buffer/buffer.go:709 (0x82bc0f) github.com/zyedidia/micro/v2/internal/buffer/buffer.go:392 (0x828292) github.com/zyedidia/micro/v2/internal/buffer/buffer.go:261 (0x8278c8) github.com/zyedidia/micro/v2/cmd/micro/micro.go:203 (0x8b9e7b) github.com/zyedidia/micro/v2/cmd/micro/micro.go:331 (0x8ba9e5) runtime/proc.go:255 (0x4386a7) runtime/asm_amd64.s:1581 (0x467941) * Do not ignore invalid filename regex error in a syntax file When the filename regex in a syntax file is malformed but the subsequent header regex is correct, the filename regex error gets silently ignored, since the `err` value is overwritten by the subsequent successful header regex result. --- internal/buffer/buffer.go | 1 + pkg/highlight/parser.go | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 6365cec0..dc4d037f 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -699,6 +699,7 @@ func (b *Buffer) UpdateRules() { header, err = highlight.MakeHeaderYaml(data) if err != nil { screen.TermMessage("Error parsing header for syntax file " + f.Name() + ": " + err.Error()) + continue } file, err := highlight.ParseFile(data) if err != nil { diff --git a/pkg/highlight/parser.go b/pkg/highlight/parser.go index b41c83c5..f46d8259 100644 --- a/pkg/highlight/parser.go +++ b/pkg/highlight/parser.go @@ -109,7 +109,7 @@ func MakeHeader(data []byte) (*Header, error) { if fnameRgx != "" { header.FtDetect[0], err = regexp.Compile(fnameRgx) } - if headerRgx != "" { + if err == nil && headerRgx != "" { header.FtDetect[1], err = regexp.Compile(headerRgx) } @@ -135,7 +135,7 @@ func MakeHeaderYaml(data []byte) (*Header, error) { if hdrYaml.Detect.FNameRgx != "" { header.FtDetect[0], err = regexp.Compile(hdrYaml.Detect.FNameRgx) } - if hdrYaml.Detect.HeaderRgx != "" { + if err == nil && hdrYaml.Detect.HeaderRgx != "" { header.FtDetect[1], err = regexp.Compile(hdrYaml.Detect.HeaderRgx) }