containerd/vendor/github.com/opencontainers/runc/libcontainer/nsenter
Sebastiaan van Stijn cb4a8f51a6
bump runc v1.0.0-rc8-32-gf4982d86
full diff: https://github.com/opencontainers/runc/compare/v1.0.0-rc8...f4982d86f7fde0b6f953cc62ccc4022c519a10a9

possibly relevant changes included:

- opencontainers/runc#2074 Update dependency libseccomp-golang
  - fixes https://nvd.nist.gov/vuln/detail/CVE-2017-18367
- opencontainers/runc#2065 Fix cgroup hugetlb size prefix for kB
- opencontainers/runc#2042 libcontainer: intelrdt: add missing destroy handler in defer func
- opencontainers/runc#2042 main: not reopen /dev/stderr
- opencontainers/runc#2038 `r.destroy` can defer exec in `runner.run` method
- opencontainers/runc#2035 specconv: always set "type: bind" in case of MS_BIND
- opencontainers/runc#2035 Move systemd.Manager initialization into a function in that module
- opencontainers/runc#2034 Support for logging from children processes

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2019-06-25 13:03:23 +02:00
..
cloned_binary.c update opencontainers/runc v1.0.0-rc7 2019-03-28 21:42:17 +01:00
namespace.h Update runc to ce450bcc6c135cae93ee2a99d41a308c179ff6dc 2017-01-26 11:31:17 -08:00
nsenter_gccgo.go Update runc to ce450bcc6c135cae93ee2a99d41a308c179ff6dc 2017-01-26 11:31:17 -08:00
nsenter_unsupported.go Update runc to ce450bcc6c135cae93ee2a99d41a308c179ff6dc 2017-01-26 11:31:17 -08:00
nsenter.go Update runc to ce450bcc6c135cae93ee2a99d41a308c179ff6dc 2017-01-26 11:31:17 -08:00
nsexec.c bump runc v1.0.0-rc8-32-gf4982d86 2019-06-25 13:03:23 +02:00
README.md Update runc to 00dc70017d222b178a002ed30e9321b126 2018-09-20 18:42:15 -04:00

nsenter

The nsenter package registers a special init constructor that is called before the Go runtime has a chance to boot. This provides us the ability to setns on existing namespaces and avoid the issues that the Go runtime has with multiple threads. This constructor will be called if this package is registered, imported, in your go application.

The nsenter package will import "C" and it uses cgo package. In cgo, if the import of "C" is immediately preceded by a comment, that comment, called the preamble, is used as a header when compiling the C parts of the package. So every time we import package nsenter, the C code function nsexec() would be called. And package nsenter is only imported in init.go, so every time the runc init command is invoked, that C code is run.

Because nsexec() must be run before the Go runtime in order to use the Linux kernel namespace, you must import this library into a package if you plan to use libcontainer directly. Otherwise Go will not execute the nsexec() constructor, which means that the re-exec will not cause the namespaces to be joined. You can import it like this:

import _ "github.com/opencontainers/runc/libcontainer/nsenter"

nsexec() will first get the file descriptor number for the init pipe from the environment variable _LIBCONTAINER_INITPIPE (which was opened by the parent and kept open across the fork-exec of the nsexec() init process). The init pipe is used to read bootstrap data (namespace paths, clone flags, uid and gid mappings, and the console path) from the parent process. nsexec() will then call setns(2) to join the namespaces provided in the bootstrap data (if available), clone(2) a child process with the provided clone flags, update the user and group ID mappings, do some further miscellaneous setup steps, and then send the PID of the child process to the parent of the nsexec() "caller". Finally, the parent nsexec() will exit and the child nsexec() process will return to allow the Go runtime take over.

NOTE: We do both setns(2) and clone(2) even if we don't have any CLONE_NEW* clone flags because we must fork a new process in order to enter the PID namespace.