From 8b2d2d175cf5fbb34c58238ca5dd2d695679525e Mon Sep 17 00:00:00 2001 From: Harikrishnan Balagopal Date: Fri, 18 Oct 2024 18:26:04 +0530 Subject: [PATCH 1/2] fix: recover from panic in compose library parse function Signed-off-by: Harikrishnan Balagopal --- transformer/compose/v1v2.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/transformer/compose/v1v2.go b/transformer/compose/v1v2.go index 05b36844b..78c02fd1c 100755 --- a/transformer/compose/v1v2.go +++ b/transformer/compose/v1v2.go @@ -87,8 +87,8 @@ func removeNonExistentEnvFilesV2(path string) preprocessFunc { } } -// parseV2 parses version 2 compose files -func parseV2(path string, interpolate bool) (*project.Project, error) { +// panicky_parseV2 parses version 2 compose files (can panic on proj.Parse()) +func panicky_parseV2(path string, interpolate bool) (*project.Project, error) { context := project.Context{} context.ComposeFiles = []string{path} context.ResourceLookup = new(lookup.FileResourceLookup) @@ -124,6 +124,18 @@ func parseV2(path string, interpolate bool) (*project.Project, error) { return proj, nil } +// parseV2 parses version 2 compose files while capturing panics +func parseV2(path string, interpolate bool) (result *project.Project, err error) { + defer func() { + if r := recover(); r != nil { + logrus.Errorf("recovered from panic in panicky_parseV2: %q", r) + err = fmt.Errorf("panicky_parseV2 failed: %q", r) + } + }() + result, err = panicky_parseV2(path, interpolate) + return result, err +} + // ConvertToIR loads a compose file to IR func (c *v1v2Loader) ConvertToIR(composefilepath string, serviceName string, parseNetwork bool) (ir irtypes.IR, err error) { proj, err := parseV2(composefilepath, true) From 2dfcb9eab68ba4e5010316b46a474c25ae94918d Mon Sep 17 00:00:00 2001 From: Harikrishnan Balagopal Date: Fri, 18 Oct 2024 18:35:23 +0530 Subject: [PATCH 2/2] fixup! fix: recover from panic in compose library parse function Signed-off-by: Harikrishnan Balagopal --- transformer/compose/v1v2.go | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/transformer/compose/v1v2.go b/transformer/compose/v1v2.go index 78c02fd1c..f7df91ca7 100755 --- a/transformer/compose/v1v2.go +++ b/transformer/compose/v1v2.go @@ -87,8 +87,20 @@ func removeNonExistentEnvFilesV2(path string) preprocessFunc { } } -// panicky_parseV2 parses version 2 compose files (can panic on proj.Parse()) -func panicky_parseV2(path string, interpolate bool) (*project.Project, error) { +// parseCapturingPanics parses version 2 compose files while capturing panics +func parseCapturingPanics(proj *project.Project) (err error) { + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("recovered from panic in compose Project.Parse: %q", r) + logrus.Error(err) + } + }() + err = proj.Parse() + return err +} + +// parseV2 parses version 2 compose files +func parseV2(path string, interpolate bool) (*project.Project, error) { context := project.Context{} context.ComposeFiles = []string{path} context.ResourceLookup = new(lookup.FileResourceLookup) @@ -114,7 +126,7 @@ func panicky_parseV2(path string, interpolate bool) (*project.Project, error) { proj := project.NewProject(&context, nil, &parseOptions) originalLevel := logrus.GetLevel() logrus.SetLevel(logrus.FatalLevel) // TODO: this is a hack to prevent libcompose from printing errors to the console. - err = proj.Parse() + err = parseCapturingPanics(proj) logrus.SetLevel(originalLevel) // TODO: this is a hack to prevent libcompose from printing errors to the console. if err != nil { err := fmt.Errorf("failed to load docker compose file at path %s Error: %q", path, err) @@ -124,18 +136,6 @@ func panicky_parseV2(path string, interpolate bool) (*project.Project, error) { return proj, nil } -// parseV2 parses version 2 compose files while capturing panics -func parseV2(path string, interpolate bool) (result *project.Project, err error) { - defer func() { - if r := recover(); r != nil { - logrus.Errorf("recovered from panic in panicky_parseV2: %q", r) - err = fmt.Errorf("panicky_parseV2 failed: %q", r) - } - }() - result, err = panicky_parseV2(path, interpolate) - return result, err -} - // ConvertToIR loads a compose file to IR func (c *v1v2Loader) ConvertToIR(composefilepath string, serviceName string, parseNetwork bool) (ir irtypes.IR, err error) { proj, err := parseV2(composefilepath, true)