From 18e6d624f8b572a56435776e58830222b4299e12 Mon Sep 17 00:00:00 2001 From: Hari Date: Fri, 18 Oct 2024 19:10:42 +0530 Subject: [PATCH] fix: recover from panic in compose library parse function (#1197) * fix: recover from panic in compose library parse function Signed-off-by: Harikrishnan Balagopal --- transformer/compose/v1v2.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/transformer/compose/v1v2.go b/transformer/compose/v1v2.go index 05b36844b..f7df91ca7 100755 --- a/transformer/compose/v1v2.go +++ b/transformer/compose/v1v2.go @@ -87,6 +87,18 @@ func removeNonExistentEnvFilesV2(path string) preprocessFunc { } } +// 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{} @@ -114,7 +126,7 @@ func 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)