From 39318f177965b3fa49cb4343c6a8c224836febd6 Mon Sep 17 00:00:00 2001 From: Valentin Rothberg Date: Tue, 30 Nov 2021 17:39:05 +0100 Subject: [PATCH] top: parse ps(1) args correctly The arguments of ps(1) should be shlexed. Fixes: #12452 Signed-off-by: Valentin Rothberg --- libpod/container_top_linux.go | 18 +++++++++++++++++- test/e2e/top_test.go | 5 +++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/libpod/container_top_linux.go b/libpod/container_top_linux.go index 0d4cba85ed..d4f4ddfc18 100644 --- a/libpod/container_top_linux.go +++ b/libpod/container_top_linux.go @@ -4,6 +4,7 @@ package libpod import ( "bufio" + "fmt" "os" "strconv" "strings" @@ -11,6 +12,7 @@ import ( "github.com/containers/podman/v3/libpod/define" "github.com/containers/podman/v3/pkg/rootless" "github.com/containers/psgo" + "github.com/google/shlex" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -51,7 +53,21 @@ func (c *Container) Top(descriptors []string) ([]string, error) { return nil, psgoErr } - output, err = c.execPS(descriptors) + // Note that the descriptors to ps(1) must be shlexed (see #12452). + psDescriptors := []string{} + for _, d := range descriptors { + shSplit, err := shlex.Split(d) + if err != nil { + return nil, fmt.Errorf("parsing ps args: %v", err) + } + for _, s := range shSplit { + if s != "" { + psDescriptors = append(psDescriptors, s) + } + } + } + + output, err = c.execPS(psDescriptors) if err != nil { return nil, errors.Wrapf(err, "error executing ps(1) in the container") } diff --git a/test/e2e/top_test.go b/test/e2e/top_test.go index 93c4f3f12b..1a71ebf333 100644 --- a/test/e2e/top_test.go +++ b/test/e2e/top_test.go @@ -101,6 +101,11 @@ var _ = Describe("Podman top", func() { result.WaitWithDefaultTimeout() Expect(result).Should(Exit(0)) Expect(len(result.OutputToStringArray())).To(BeNumerically(">", 1)) + + result = podmanTest.Podman([]string{"top", session.OutputToString(), "ax -o args"}) + result.WaitWithDefaultTimeout() + Expect(result).Should(Exit(0)) + Expect(result.OutputToStringArray()).To(Equal([]string{"COMMAND", "top -d 2"})) }) It("podman top with comma-separated options", func() {