From 00ba5fbac7ca520ca33e113867487f3f8f882a96 Mon Sep 17 00:00:00 2001 From: SAY-5 Date: Wed, 22 Apr 2026 21:36:34 -0700 Subject: [PATCH] fix(ssh): bind ssh.task_definition to sshCmd's own flag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cmd/ssh.go bound ssh.task_definition to runCmd.PersistentFlags().Lookup("task_definition"). runCmd does not define task_definition (its BindPFlag line is commented out in cmd/run.go), so the Lookup returned a nil *pflag.Flag. viper.BindPFlag silently stored the nil binding, and the first viper.Get("ssh.task_definition") in the command path panicked inside pflagValue.HasChanged — crashing 'ecs-tool ssh' with: panic: runtime error: invalid memory address or nil pointer dereference viper.pflagValue.HasChanged flags.go:41 viper.(*Viper).find viper.go:914 cmd.glob..func9 ssh.go:26 Bind to sshCmd's own PersistentFlags, which is where the flag is actually registered two lines above. Refs springload/ecs-tool issue 41. --- cmd/ssh.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cmd/ssh.go b/cmd/ssh.go index ec7298e..e05c938 100644 --- a/cmd/ssh.go +++ b/cmd/ssh.go @@ -40,7 +40,11 @@ var sshCmd = &cobra.Command{ func init() { rootCmd.AddCommand(sshCmd) sshCmd.PersistentFlags().StringP("task_definition", "t", "", "name of task definition to use (required)") - viper.BindPFlag("ssh.task_definition", runCmd.PersistentFlags().Lookup("task_definition")) + // Bind to sshCmd's own flag. runCmd does not define task_definition + // (its BindPFlag call is commented out), so the lookup returned a + // nil *pflag.Flag and any later viper.Get("ssh.task_definition") + // call panicked inside pflagValue.HasChanged. + viper.BindPFlag("ssh.task_definition", sshCmd.PersistentFlags().Lookup("task_definition")) viper.SetDefault("ssh.push_ssh_key", true) viper.SetDefault("ssh.task_definition", viper.GetString("task_definition"))