diff --git a/daemon/list.go b/daemon/list.go index e84353419f..3bc819a79f 100644 --- a/daemon/list.go +++ b/daemon/list.go @@ -20,6 +20,19 @@ var acceptedVolumeFilterTags = map[string]bool{ "dangling": true, } +var acceptedPsFilterTags = map[string]bool{ + "ancestor": true, + "before": true, + "exited": true, + "id": true, + "isolation": true, + "label": true, + "name": true, + "status": true, + "since": true, + "volume": true, +} + // iterationAction represents possible outcomes happening during the container iteration. type iterationAction int @@ -128,7 +141,12 @@ func (daemon *Daemon) reducePsContainer(container *container.Container, ctx *lis func (daemon *Daemon) foldFilter(config *types.ContainerListOptions) (*listContext, error) { psFilters := config.Filter + if err := psFilters.Validate(acceptedPsFilterTags); err != nil { + return nil, err + } + var filtExited []int + err := psFilters.WalkValues("exited", func(value string) error { code, err := strconv.Atoi(value) if err != nil { diff --git a/integration-cli/docker_cli_ps_test.go b/integration-cli/docker_cli_ps_test.go index 51cc4349ce..cc32194d5a 100644 --- a/integration-cli/docker_cli_ps_test.go +++ b/integration-cli/docker_cli_ps_test.go @@ -213,6 +213,12 @@ func assertContainerList(out string, expected []string) bool { return true } +func (s *DockerSuite) TestPsListContainersInvalidFilterName(c *check.C) { + out, _, err := dockerCmdWithError("ps", "-f", "invalidFilter=test") + c.Assert(err, checker.NotNil) + c.Assert(out, checker.Contains, "Invalid filter") +} + func (s *DockerSuite) TestPsListContainersSize(c *check.C) { // Problematic on Windows as it doesn't report the size correctly @swernli testRequires(c, DaemonIsLinux)