From ce5a0c656f140f577a8a304298dba336427dcbb5 Mon Sep 17 00:00:00 2001 From: Laura Brehm Date: Wed, 20 Dec 2023 13:06:15 +0000 Subject: [PATCH] Fix cancellable context detection in `AdaptCmd` `AdaptCmd` was previously checking for a `.WithCancel` suffix on context strings, however it's possible for a context to be cancellable without ending in that suffix, such as when `context.WithValue` was called after `WithContext`, e.g.: ```go context.Background.WithCancel.WithValue(type trace.traceContextKeyType, val ).WithValue(type api.DryRunKey, val ) ``` Signed-off-by: Laura Brehm --- cmd/compose/compose.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cmd/compose/compose.go b/cmd/compose/compose.go index d2f8e98e9..72d8effc7 100644 --- a/cmd/compose/compose.go +++ b/cmd/compose/compose.go @@ -42,6 +42,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" + "github.com/docker/cli/cli-plugins/plugin" "github.com/docker/compose/v2/cmd/formatter" "github.com/docker/compose/v2/pkg/api" "github.com/docker/compose/v2/pkg/compose" @@ -75,7 +76,7 @@ func AdaptCmd(fn CobraCommand) func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { ctx := cmd.Context() contextString := fmt.Sprintf("%s", ctx) - if !strings.HasSuffix(contextString, ".WithCancel") { // need to handle cancel + if !strings.Contains(contextString, ".WithCancel") || plugin.RunningStandalone() { // need to handle cancel cancellableCtx, cancel := context.WithCancel(cmd.Context()) ctx = cancellableCtx s := make(chan os.Signal, 1) @@ -277,7 +278,12 @@ const PluginName = "compose" // RunningAsStandalone detects when running as a standalone program func RunningAsStandalone() bool { - return len(os.Args) < 2 || os.Args[1] != manager.MetadataSubcommandName && os.Args[1] != PluginName + println("check running as standalone") + standalone := len(os.Args) < 2 || os.Args[1] != manager.MetadataSubcommandName && os.Args[1] != PluginName + fmt.Fprintf(os.Stderr, "%v+\n", os.Args) + println("len os.args", len(os.Args)) + println("STANDALONE:", standalone) + return standalone } // RootCommand returns the compose command with its child commands