summaryrefslogtreecommitdiff
path: root/libpod/container_internal.go
diff options
context:
space:
mode:
authorOpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com>2019-12-20 12:13:22 +0100
committerGitHub <noreply@github.com>2019-12-20 12:13:22 +0100
commite33d7e9fab9974c8c13868e7434f78feab7508af (patch)
tree8eb093ebf09aed38f569534517e395c9439bec67 /libpod/container_internal.go
parent1ba6d0f883e17f2d460773f929873563b753d3e6 (diff)
parent123b8c627d53c6bd76ff4d9f6a74674341a987c0 (diff)
downloadpodman-e33d7e9fab9974c8c13868e7434f78feab7508af.tar.gz
podman-e33d7e9fab9974c8c13868e7434f78feab7508af.tar.bz2
podman-e33d7e9fab9974c8c13868e7434f78feab7508af.zip
Merge pull request #4727 from rhatdan/pidns
if container is not in a pid namespace, stop all processes
Diffstat (limited to 'libpod/container_internal.go')
-rw-r--r--libpod/container_internal.go21
1 files changed, 19 insertions, 2 deletions
diff --git a/libpod/container_internal.go b/libpod/container_internal.go
index 37801162a..9d97ac5d6 100644
--- a/libpod/container_internal.go
+++ b/libpod/container_internal.go
@@ -1129,9 +1129,14 @@ func (c *Container) start() error {
}
// Internal, non-locking function to stop container
-func (c *Container) stop(timeout uint, all bool) error {
+func (c *Container) stop(timeout uint) error {
logrus.Debugf("Stopping ctr %s (timeout %d)", c.ID(), timeout)
+ // If the container is running in a PID Namespace, then killing the
+ // primary pid is enough to kill the container. If it is not running in
+ // a pid namespace then the OCI Runtime needs to kill ALL processes in
+ // the containers cgroup in order to make sure the container is stopped.
+ all := !c.hasNamespace(spec.PIDNamespace)
// We can't use --all if CGroups aren't present.
// Rootless containers with CGroups v1 and NoCgroups are both cases
// where this can happen.
@@ -1225,7 +1230,7 @@ func (c *Container) restartWithTimeout(ctx context.Context, timeout uint) (err e
if c.state.State == define.ContainerStateRunning {
conmonPID := c.state.ConmonPID
- if err := c.stop(timeout, false); err != nil {
+ if err := c.stop(timeout); err != nil {
return err
}
// Old versions of conmon have a bug where they create the exit file before
@@ -1895,3 +1900,15 @@ func (c *Container) reapExecSessions() error {
}
return lastErr
}
+
+func (c *Container) hasNamespace(namespace spec.LinuxNamespaceType) bool {
+ if c.config.Spec == nil || c.config.Spec.Linux == nil {
+ return false
+ }
+ for _, n := range c.config.Spec.Linux.Namespaces {
+ if n.Type == namespace {
+ return true
+ }
+ }
+ return false
+}