* crun-1.28

- CVE-2026-47766: do not follow rootfs /dev symlinks.  Open rootfs
  /dev with safe_openat before creating default or handler-specific
  devices, preventing rootfs-controlled /dev symlinks from redirecting
  device setup outside the container rootfs.
- build: replace YAJL with json-c (>= 0.14) for JSON parsing and
  generation.
- build: use system libblake3 if available.
- status: restrict valid container ID names.  Allow only IDs that
  match [a-zA-Z0-9_+-][a-zA-Z0-9_+.-]*, following the same
  validation used by runc.
- cgroup: reject ".." in delegate-cgroup annotation value to prevent
  path traversal.
- exec: use default environment variables with --env.  Previously
  when crun exec --env was used, the environment from the container
  spec was not set.
- exec: more verbose error message, include the actual path that
  failed to exec.
- libcrun: use O_PATH where applicable so the kernel does not grant
  read/write access on the inode when a file descriptor is only used
  as a reference.
- chroot_realpath: fix potential buffer overflows in destination
  buffer when resolving symlink chains.
- fix UID/GID mapping buffer offset for multi-line mappings.
- krun: allow configuring the virtiofs device tag and shm_size.
- krun: request enabling DHCP client when using passt.
- krun: fix parsing optional fields from krun_vm.json.

* crun-1.27.1

- linux: fix bind mount propagation regression.  Mounts hot-plugged
  after container start (e.g. USB drives) were invisible or owned by
  nobody inside the container because propagation peer groups were
  destroyed.
- utils: fix AppArmor profile inside a user namespace.
- cgroup: fix recursive cgroup cleanup failure that could cause EBADF
  errors when deleting containers with sub-cgroups.
- libcrun: do not check the cgroup file system type when cgroups are
  disabled with --cgroup-manager=disabled, fixing startup failures on
  systems where /sys/fs/cgroup is not a standard mount (e.g. Android
  with Linux Deploy).
- libcrun: fix "unlink /dev/console: Read-only file system" error when
  running containers with --read-only.
- krun: add support for passt-based networking in microVMs via the
  krun.use_passt annotation.
- krun: add support for nested virtualization in microVMs via the
  krun.nested_virt annotation.
- krun: ignore RAM configurations below 128MB.

* crun-1.27

- CVE-2026-30892: fix parsing in `crun exec -u` that could lead to the
  process running with the wrong user.
- linux: use open_tree+mount_setattr and open_tree+move_mount for
  device mounts, masked paths, and readonly paths.  This avoids
  unnecessary syscalls and improves container startup performance.
- linux: use mount_setattr for readonly remounts in finalize_mounts.
- linux: skip redundant MS_PRIVATE propagation mounts.
- linux: validate run.oci.mount_context_type annotation value.
- container: skip sigaction reset in unblock_signals for the run path.
- container: delete the container on poststart hooks failures.
- container: fix createRuntime hooks not receiving bundle path.
- container: fix exit code return.
- cgroup: skip enable_controllers when joined via CLONE_INTO_CGROUP.
- cgroup: pass cgroup2 mount options to the kernel.
- cgroup: fix read_pids_cgroup skipping child cgroups.
- hooks: allow ignoring chdir permission errors for container hooks.
- hooks: exit immediately if poststart hooks fail.
- krun: parse annotations for krun.cpus, krun.ram_mib, and
  krun.variant.
- krun: propagate crun log level to libkrun.
- krun: rename nitro module to awsnitro.
- criu: show excerpt from log file on checkpoint/restore error.
- criu: fix missing umount() in error path.
- scheduler: add diagnostic messages for SCHED_DEADLINE.
- utils: fix memory leak and missing cache in
  libcrun_initialize_apparmor().
- utils: use parent dir fd for bind on long socket paths.
- utils: retry fgetpwent_r() on EINTR.
- python: initialize error variable to NULL in Python bindings.
- container: fix CPU busy loop when output pipe is blocked.
- seccomp: fix n_plugins calculation.
- restore: fix memory leak.
- numerous fixes for error handling, errno usage, and resource leaks.

* crun-1.26

- criu: enable setting of RPC config file via annotation
  org.criu.config.  crun also reads /etc/criu/crun.conf or
  /etc/criu/runc.conf for CRIU configuration.
- linux: run createContainer hooks before making root read-only.
- utils: handle NULL container passed to libcrun_open_proc_file().
- container: fix error release on failure paths.

* crun-1.25.1

- linux: harden opens under /proc.  Use fsopen, when available, to get
  a trusted reference to the proc file system and use it for all
  subsequent accesses instead of relying on the /proc path directly.

* crun-1.25

- cgroup: enable all accounting properties to ensure stats are readable.
- intelrdt: honor default closID.
- src: fix some double allocations on errors.

* crun-1.24

- linux: add support for NUMA set_mempolicy.
- intelrdt: add support for EnableMonitoring
- linux: optimize masked paths with shared empty directory.
- cgroup, systemd: validate the specified ebpf program is loaded by systemd.
- krun: avoid failing if sev/nitro are not available.
- linux: limit tmpfs memory usage for masked paths.
- linux: fix regression mounting within userns.  Detect when running inside a
  user namespace and treat the mounts in the same way as they would be treated
  with a new user namespace.
- linux: never chown devices.

* crun-1.23.1

- exec: fix a bug where the terminal could lose some bytes when
  reading from the exec'ed process.
- utils: add bounds checking for Unix domain socket paths.

* crun-1.23

- krun: enable virtio-gpu.  Enable and configure a virtio-gpu device
  if /dev/dri and /usr/libexec/virgl_render_server are present within
  the container.
- krun: add support for nitro enclaves.
- criu: Add support for tcp-close.
- linux: fix issue when RestrictAddressFamilies="AF_UNIX AF_NETLINK" is
  in place in the systemd unit.  Regression introduced in crun 1.17.
- cgroup,systemd: use BPFProgram=device on systemd to install the device
  controller eBPF.
- cgroup,systemd: allow empty slice in cgroupsPath.
- crun: print the program version even with an invalid rundir.
- linux: fix regression with idmapped mounts.  Support idmapped mounts
  also when there is no user namespace specified for the container.
  crun 1.22 introduced the regression.
- cgroup: change formula to convert from cpu shares to cpu weight.
  The OCI CPU shares (range [2-262144]) to cgroup v2 `cpu.weight`
  (range [1-10000]) conversion formula has been updated to use a
  quadratic function so that min, max and default  values match.

* crun-1.22

- crun: add a new command crun mounts to dynamically add or remove
  mounts from a running container.
- linux: add support for moving existing network devices into the
  container namespace as defined in the OCI specification.
- linux: add src-nofollow and dest-nofollow mount options for more
  precise control over how symbolic links are handled.
- krun: implement support for external kernels, allowing users to
  bundle a kernel image with the container.
- krun: the vCPU limit has been increased to 16.
- krun: add support for specifying the libkrun flavor via the
  KRUN_VM_FILE.
- criu: fix checkpoint and restore for containers that have a bind
  mount where the destination is a symbolic link.
- criu: automatically create the directory specified by --work-path if
  it does not exist, improving compatibility with other runtimes.
- criu: re-enable support on the riscv64 architecture.
- cgroup: fix incorrect setting of cpu.max when the OCI quota is -1.
- hardening: replace all uses of the insecure sprintf function with
  safer alternatives like snprintf to prevent buffer overflows.
- fix a regression that caused issues when dealing with paths that do
  not exist and openat2 is not available.
- fix an issue where the file descriptor for the rootfs would become
  stale if the rootfs was replaced by a mount.
- fix parsing of rootless options.
- fix a potential crash in krun by checking if library handles exist
  before being unloaded.
- improve error messages for dlopen failures, making them more descriptive.
- cgroup: fix a regression on WSL when running with cgroup v1.
- libcrun: setup /dev/console as a symlink to pty instead of bind mount
  when possible.

* crun-1.21

- criu: when running under systemd, use a proxy process to initialize
  the cgroup so that all the container processes are restored in the
  correct cgroup.
- set HOME to "/" if the specified user is not present in the /etc/passwd file.
- do not fail if any of stdin/stdout/stderr is closed.
- cgroup: fix handling of absent subcgroup when configuring cpuset on cgroup v1.
- ignore SIGWINCH when a tty is not used
- utils: improve error message if the specified command is not executable.
- fix PATH lookup.  Support filenames starting with a dot.
- krun: create context after loading the library
- krun: stop using krun_set_exec but use the command line directly
  from the OCI configuration file.

* crun-1.20

- krun: fix CVE-2025-24965.  The .krun_config.json file could be
  created outside of the container rootfs.
- cgroup: reverted the removal of `tun/tap` from the default allow
  list, this was done in crun-1.5. The `tun/tap` device is now added
  by default again.
- CRIU: do not set `network_lock` unless explicitly specified.
- status: disallow container names containing slashes in their name.
- linux: Improved error message when failing to set the
  `net.ipv4.ping_group_range` sysctl.
- scheduler: Ignore `ENOSYS` errors when resetting the CPU affinity
  mask.
- linux: return a better error message when `pidfd_open` fails with
  `EINVAL`.
- cgroup: display the absolute path to `cgroup.controllers` when a
  controller is unavailable.
- exec: always call setsid.  Now processes created through `exec` get
  the correct process group id.

* crun-1.19.1

- linux: fix a hang if there are no reads from the tty.  Use non
  blocking sockets to read and write from the tty so that the "crun
  exec" process doesn't hang when the terminal is not consuming any
  data.
- linux: remove the workaround needed to mount a cgroup on top of
  another cgroup mount.  The workaround had the disadvantage to
  temporarily leak a mount on the host.  The alternative that is
  currently used is to mount a temporary tmpfs between the two cgroup
  mounts.

* crun-1.19

- wasm: add new handler wamr.
- criu: allow passing network lock method to libcriu.
- linux: honor exec cpu affinity mask.
- build: fix build with musl libc.
- crun: use mount API to self-clone.
- cgroup, systemd: do not override devices on update.  If the "update" request has no
  device block configured, do not reset the previously configuration.
- cgroup: handle case where cgroup v1 freezer is disabled.  On systems without the
  freezer controller, containers were mistakenly reported as paused.
- cgroup: do not stop process on exec.  The cpu mask is configured on the systemd
  scope, the previous workaround to stop the container until the cgroup is fully
  configured is no longer needed.

* crun-1.18.2

- cgroup, systemd: fix a regression when a configuration file includes only one
  default rule.

* crun-1.18.1

- cgroup: deprecate cgroup v1.
- cgroup: fix regression setting up the devices cgroup on cgroup v1.
- cgroup: fix regression and work again with the default Docker devices
  configuration on systemd.
- linux: fix setting up user namespace when newuidmap/newgidmap are not available.

* crun-1.18

- cgroup: support running without a sub-cgroup with systemd.  Use the
  d-bus API to set the container limits on the systemd scope itself.
  It allows running without a sub-cgroup when the systemd driver is
  used, the run.oci.systemd.subgroup annotation controls it.  For now,
  a sub-cgroup is still created, but it might be changed in future.
- cgroup: add support for the misc controller.
- linux: fix running on kernel without user namespaces.
- criu, restore: add lsm-profile option.
- criu, restore: add lsm-mount-context option.
- linux: add duplicate namespace detection.

* crun-1.17

- Add `--log-level` option.  It accepts `error`, `warning` and `error`.
- Add debug logs for container creation.
- Fix double-free in crun exec code that could lead to a crash.
- Allow passing an ID to the journald log driver.
- Report "executable not found" errors after tty has been setup.
- Do not treat EPIPE from hooks as an error.
- Make sure `DefaultDependencies` is correctly set in the systemd scope.
- Improve the error message when the container process is not found.
- Improve error handling for the mnt namespace restoration.
- Fix error handling for `getpwuid_r`, `recvfrom` and `libcrun_kill_linux`.
- Fix handling of device paths with trailing slashes.

* crun-1.16.1

- fix a regression introduced by 1.16 where using 'rshared' rootfs
  mount propagation and the rootfs itself is a mountpoint.
- inherit user from original process on exec, if not overridden.

* crun-1.16

- build: fix build for s390x.
- linux: fix mount of special files with rro.  Open the mount target
  with O_PATH to prevent open(2) failures with special files like
  FIFOs or UNIX sockets.
- Fix sd-bus error handling for cpu quota and period props update.
- container: use relative path for rootfs if possible.  If the rootfs
  cannot be resolved and it is below the current working directory,
  only use its relative path.
- wasmedge: access container environment variables for the WasmEdge
  configuration.
- cgroup, systemd: use MemoryMax instead of MemoryLimit.  Fixes a
  warning for using an old configuration name.
- cgroup, systemd: improve checks for sd_bus_message_append errors

* crun-1.15

- fix a mount point leak under /run/crun, add a retry mechanism to
  unmount the directory if the removal failed with EBUSY.
- linux: cgroups: fix potential mount leak when /sys/fs/cgroup is
  already mounted, causing the posthooks to not run.
- release: build s390x binaries using musl libc.
- features: add support for potentiallyUnsafeConfigAnnotations.
- handlers: add option to load wasi-nn plugin for wasmedge.
- linux: fix "harden chdir()" security measure.  The previous check
  was not correct.
- crun: add option --keep to the run command.  When specified the
  container is not automatically deleted when it exits.

* crun-1.14.4

- linux: fix mount of file with recursive flags.  Do not assume it is
  a directory, but check the source type.

* crun-1.14.3

- follow up for 1.14.2.  Drop the version check for each command.

* crun-1.14.2

- crun: drop check for OCI version.  A recent bump in the OCI runtime
  specs caused crun to fail with every config file.  Just drop the
  check since it doesn't add any value.

* crun-1.14.1

- there was recently a security vulnerability (CVE-2024-21626) in runc
  that allowed a malicious user to chdir(2) to a /proc/*/fd entry that is
  outside the container rootfs.  While crun is not affected directly,
  harden chdir by validating that we are still inside the container
  rootfs.
- container: attempt to close all the files before execv(2).
  if we leak any fd, it prevents execv to gain access to files outside
  the container rootfs through /proc/self/fd/$fd.
- fix a regression caused by 1.14 when installing the ebpf filter on a
  kernel older than 5.11.
- cgroup, systemd: fix segfault if the resources block is not specified.

* crun-1.14

- build: drop dependency on libgcrypt.  Use blake3 to compute the cache
  key.
- cpuset: don't clobber parent cgroup value when writing the cpuset
  value.
- linux: force umask(0).  Iit ensures that the `mknodat` syscall is
  not affected by the umask of the calling process, allowing file
  permissions to be set as specified in the OCI configuration.
- ebpf: do not require MEMLOCK for eBPF programs.  This requirement
  was relaxed in Linux 5.11.

* crun-1.13

- src: use O_CLOEXEC for all open/openat calls
- cgroup v1: use "max" when pids limit < 0.
- improve error message when idmap mount fails because the underlying
  file system has no support for it.
- libcrun: fix compilation when building without libseccomp and libcap.
- fix relative idmapped mount when using the custom annotation.

* crun-1.12

- add new WebAssembly handler: spin.
- systemd: fallback to system bus if session bus is not available.
- configure the cpu rt and cpuset controllers before joining them to
  avoid running temporarily the workload on the wrong cpus.
- preconfigure the cpuset with required resources instead of using the
  parent's set.  This prevents needless churn in the kernel as it
  tracks which CPUs have load balancing disabled.
- try attr/<lsm>/* before the attr/* files.  Writes to the attr/*
  files may fail if apparmor is not the first "major" LSM in the list
  of loaded LSMs (e.g. lsm=apparmor,bpf vs lsm=bpf,apparmor).

* crun-1.11.2

- fix a regression caused by 1.11.1 where the process crashes if there
  are no CPU limits configured on cgroup v1.
- fix error code check for the ptsname_r function.

* crun-1.11.1

- force a remount operation with bind mounts from the host to correctly
  set all the mount flags.

* crun-1.11

- cgroup: honor cpu burst.
- systemd: set CPUQuota and CPUPeriod on the scope cgroup.
- linux: append tmpfs mode if missing for mounts.  This is the same
  behavior of runc.
- cgroup: always use the user session for rootless.

* crun-1.10

- support for Intel Resource Director Technology (RDT).
- new mount option "copy-symlink".  When provided for a mount, if the
  source is a symlink, then it is copied in the container instead of
  attempting a mount.
- linux: open mounts before setgroups if in a userns.  This solves a
  problem where a directory that was previously accessible to the
  user, become inaccessible after setgroups causing the bind mount to
  fail.

* crun-1.9.2

- cgroup: reset the inherited cpu affinity after moving to cgroup.
  Old kernels do that automatically, but new kernels remember the
  affinity that was set before the cgroup move, so we need to reset
  it in order to honor the cpuset configuration.

* crun-1.9.1

- utils: ignore ENOTSUP when chmod a symlink. It fixes a problem on
  Linux 6.6 that always refuses chmod on a symlink.
- build: fix build on CentOS 7
- linux: add new fallback when mount fails with EBUSY, so that there
  is not an additional tmpfs mount if not needed.
- utils: improve error message when a directory cannot be created as
  a component of the path is already existing as a non directory.

* crun-1.9

- linux: support arbitrary idmapped mounts.  Now it is possible to
  specify a mapping for any type of mount, not only bind mounts.
- linux: add support for "ridmap" mount option to support recursive
  idmapped mounts.
- crun delete: call systemd's reset-failed.  In case systemd cgroup
  driver is used, and the systemd unit has failed (e.g. oom-killed),
  systemd won't remove the unit (that is, unless the "CollectMode:
  inactive-or-failed" property is set).
- linux: fix check for oom_score_adj.  Write the oom_score_adj file
  even when the new value is 0.
- features: Support mountExtensions.
- linux: correctly handle unknown signal string when it doesn't start
  with a digit.
- linux: do not attempt to join again already joined namespace.
- wasmer: use latest wasix API.

* crun-1.8.7

- linux: fix a race condition when an exec was performed
  immediately after the start and the setns with the procfd failed.
- features: Fix annotations formatting.
- linux: do not write some errors twice.
- libcrun: handle SIGWINCH by resizing the terminal file descriptor.
- crun: new command "crun features".
- linux: fix handling of idmapped mounts when the container joins
  an existing PID namespace.
- linux: support io_priority from the OCI specs.
- linux: handle correctly the case where the status file is not
  written yet for a container.
- crun: fix segfault for "ps" when the container is not using cgroups.
- cgroup: allow setting swap to 0.

* crun-1.8.6

- crun: new command "crun features".
- linux: fix handling of idmapped mounts when the container joins
  an existing PID namespace.
- linux: support io_priority from the OCI specs.
- linux: handle correctly the case where the status file is not
  written yet for a container.
- crun: fix segfault for "ps" when the container is not using cgroups.
- cgroup: allow setting swap to 0.

* crun-1.8.5

- scheduler: use definition from the OCI configuration file instead of the custom
  label that is now dropped and not supported anymore.
- cgroup: fix creating cgroup under "domain threaded".
- cgroup, systemd: set the memory limit on the system scope.
- restore tty settings from the correct file descriptor.  It was previously
  restoring the settings from the wrong file descriptor causing the tty settings
  to be changed on the calling terminal.
- criu: check if the criu_join_ns_add function exists.  Fix a segfault with new
  versions of CRIU.
- linux: do not precreate devs with euid > 0.  Fix creating devices when running
  the OCI runtime as non root user.
- linux: improve PID detection on systems that lack pidfd.  While there is still a
  window of time that the PID could be recycled, now it is now reduced to a minimum.
- criu: fix memory leak.
- logging: improve error message when dlopen fails.

* crun-1.8.4

- fix build on CentOS 7.
- drop custom annotation to set the time namespace and use the OCI
  specs instead.
- cgroup: workaround cpu quota/period issue with v1.  Sometimes
  setting CPU quota period fails when a new period is lower, and a
  parent cgroup has CPU quota limit set.
- cgroup: fix set quota to -1 on cgroup v1.
- criu: drop loading unused functions.

* crun-1.8.3

- update: initialize the rt limits only on cgroup v1.

* crun-1.8.2

- lua bindings for libcrun.
- wasmedge: add current directory to preopen paths.
- linux: inherit parent mount flags when making a path masked.
- libcrun: custom annotation to set the scheduler for the container process.
- cgroup: fallback to blkio.bfq files if blkio is not available on cgroup v1.
- cgroup: initialize rt limits when using systemd.
- tty: chown the tty to the exec user instead of the user specified
  to create the container.
- cgroup: fallback to create cgroupfs as sibling of the current cgroup if there
  is none specified and it cannot be created in the root cgroup.

* crun-1.8.1

- linux: idmapped mounts expect the same configuration as the user
  namespace mappings.  Before they were expecting the inverted
  mapping.  It is a breaking change, but the behavior was aligned to
  what runc will do as well.
- krun: always allow /dev/kvm in the cgroup configuration.
- handlers: disable exec for handlers that do not support it.
- selinux: allow setting fscontext using a custom annotation.
- cgroup: reset systemd unit if start fails.
- cgroup: rmdir the entire systemd scope.  It fixes a leak on cgroupv1.
- cgroup: always delete the cgroup on errors. On some errors it could
  have been leaked before.

* crun-1.8

- linux: precreate devices on the host.
- cgroup: support cpuset mounted with noprefix.
- linux: mount the source cgroup if cgroupns=host.
- libcrun: don't clone self from read-only mount.
- build: fix build without dlfcn.h.
- linux: set PR_SET_DUMPABLE.
- utils: fix applying AppArmor profile.
- linux: write setgroups=deny when mapping a single uid/gid.
- cgroup: fix enter cgroupv1 mount on RHEL 7.

* crun-1.7.2

- criu: hardcode library name to libcriu.so.2.
- cgroup: always enable all controllers, even if the cgroup was already joined.
  Regression caused by crun-1.7.

* crun-1.7.1

- criu: load libcriu dynamically.
- seccomp: initialize libgcrypt.
- handlers: fix rewriting the argv if the full cmdline doesn't fit.
- utils: honor SELinux label when using a custom handler.
- utils: honor AppArmor label when using a custom handler.
- krun: copy the OCI configuration file into the container.
- utils: fix creating the default user namespace when running with euid != 0.
- Add setlinebuf() when --debug and --log=file: are used.
- Fix timestamp format in the error messages.
- krun: disable libkrun's collection of env vars

* crun-1.7

- seccomp: use a cache for the generated BPF.
- add support for setting the domainname through the OCI spec.
- handlers: define wasm and krun.
- wasmtime: add support for compiling .wat format.
- cgroup: honor checkBeforeUpdate on cgroupv2.
- crun: chown std streams before joining the user namespace.
- crun: display rundir in --version output.
- container: with cgroupfs use clone3 to join directly the target cgroup.
- linux: create parent directories for created devices with mode 0755.
- wasm: inherit environment variables in the WasmEdge handler.

* crun-1.6

- runc compatibility: -v now prints the version string.
- build: fix build with glibc 2.36.
- container: drop intermediate userns custom feature.
- cgroup: change the delegate cgroup semantic so that the cgroup is
  created in the container payload after the cgroup namespace is created.
- seccomp: use helper process to send file descriptor to the listener
  socket.  It enables to be notified on every syscall without hanging
  the main process.
- linux: add a fallback to using kill(2) if pidfd_send_signal(2) fails
  with ENOSYS.
- krun: add support for krun-sev.
- wasmtime: always grant file system capability for workdir inside the container.
- wasmtime: inherit arguments list from the handler instead of the current process.
- wasmedge: use released wasmedge library instead of libwasmedge_c.so.

* crun-1.5

- add mono based native .NET handler
- new Wasmtime backend for running WebAssembly
- add support for wasmedge 0.10 and dropping support for wasmedge 0.9.x
- dropping support for experimental `WasmEdgeProcess` from wasmedge handler
- honor process user's uid when setting the HOME environment variable
- create the current working directory if it is missing in the container
- fallback to using a tmpfs mount if umount of /sys and /proc fails
- fallback to netlink to setup lo device
- fix creating devices in the rootfs
- fallback to using io.weight if io.bfq.weight doesn't exist
- remove tun/tap from the default allow list
- linux: devices mounts have noexec and nosuid
- fix copyup of files from the container to the tmpfs
- honor $PATH for newgidmap and newguidmap
- krun: limit the number of vCPUs to 8
- cgroup: add support for cpu.idle

* crun-1.4.5

- CRIU: add support for different manage cgroups modes.
- linux: the hook processes inherit the crun process environment if
  there is no environment block specified in the OCI configuration.
- exec: fix double free when using --apparmor and --process-label.

* crun-1.4.4

- wasm, kubernetes: support wasm for kubernetes infrastructure with side-cars
- Resolve symlinks in bind mounts when creating a user namespace.
- Fix CVE-2022-27650: exec does not set inheritable capabilities.

* crun-1.4.3

- cgroup: avoid infinite loop when deleting a cgroup if it contains
  processes that cannot be terminated.
- support additional options for idmap mounts.  It is now possible to
  specify what mappings must be used for the idmapped mount.
- open the source for a bind mount in the host.  It is useful when
  creating a user namespace so that the parent directories for the
  source directory are not required to be accessible to the users in
  the user namespace.

* crun-1.4.2

- CRIU: add pre-dump support.
- Fix running with a read-only /dev.  The /dev/console file is created
  before re-mounting /dev as read-only.
- Ignore EROFS when chowning standard stream files.
- Add validation for sysctls before applying them.
- Attempt looking up the executable after the setresuid syscall, this
  solves an issue on NFS when the executable file is not owned by root
  in the container, but the UID:GID combination configured for the
  container can access it.

* crun-1.4.1

- Fix check for an invalid path.  crun was performing the wrong check
  to validate a path, causing spurious failures at runtime.
- Allow deleting a container while in `created` state.  It goes
  against what the OCI runtime specs dictate, but it is the expected
  behavior since runc allows it.
- Fix regression when joining a container that has explicit paths for
  the namespaces.
- cgroup: do not set cpu limits if number of shares is set to 0.
  Moby uses 0 to indicate no limits.
- Fix build issues when configured with --enable-shared.
- Fix build on systems where OPEN_TREE_CLOEXEC is not defined.
- Improve diagnostics for errors returned by dbus.

* crun-1.4

- wasm: support for running on kubernetes with containerd.
- linux: add support for recursive mount options.  e.g. it is possible
  to specify "rro" to make the mount read-only recursively.
- add support for idmapped mounts through a new mount option "idmap".
- linux: improve detection of /dev target.  Previously a mount like
  `/dev/` was not properly detected as mounting /dev/ from the host.
- now crun exec uses CLONE_INTO_CGROUP on supported kernels when
  using cgroup v2.
- retry the openat2 syscall if it fails with EAGAIN.
- cgroup: set the CPUWeight/CPUShares on the systemd scope cgroup.
- on new kernels, use setns with pidfd.
- attempt the chdir again with the specified user if it failed before
  changing credentials.
- ebpf: fix build on 32 bits systems.
- crun --version shows the configured handlers.

* crun-1.3

- add support to natively build and run WebAssembly workload and
  WebAssembly containers.
- allow to specify sub-cgroup for exec.
- chown std streams if they are not a TTY.
- attach the correct streams if the container is suspended and
  restored multiple times.
- fix race condition when enabling controllers on cgroup v2.
- the fallback code to mount cgroupfs bind mounts the current
  cgroup path instead of the host /sys.

* crun-1.2

- exec: fix regression in 1.1 where containers are being wrongly
  reported as paused.
- criu: add support for external ipc, uts and time namespaces.

* crun-1.1

- cgroup: use cgroup.kill when available. It is faster to kill a
  container through its cgroup as there is no need to recurse over the
  cgroup pids and terminate each one of them.
- exec: refuse to exec in a paused container/cgroup.
- container: Set primary process to 1 via LISTEN_PID by default if
  user configuration is missing.
- criu: Add support for external PID namespace.
- criu: fix save of external descriptors.  Now restored containers
  attach correctly their standard streams.
- utils: retry openat2 on EAGAIN.  If the openat2 syscall is
  interrupted, try again.

* crun-1.0

- cgroup: chown the current container cgroup to root in the container.
- linux: treat pidfd_open failures EINVAL as ESRCH
- cgroup: add support for setting memory.use_hierarchy on cgroup v1.
- Makefile.am: fix link error when using directly libcrun.
- Fix symlink target mangling for tmpcopyup targets.

* crun-0.21

- honor memory swappiness set to 0
- status: add fields for owner and created timestamp
- cgroup: lookup pids controller as well when the memory controller
  is not available
- when compiled with krun, automatically use it if the current
  executable file is called "krun".

* crun-0.20.1

- container: ignore error when resetting the SELinux label for the
  keyring.

* crun-0.20

- container: call prestart hooks before rootfs is RO.
- cgroup: added support cleaning custom controllers on cgroupv1.
- spec: add support for --bundle.
- exec: add --no-new-privs.
- exec: add --process-label and --apparmor to change SELinux and
  AppArmor labels.
- cgroup: kill procs in cgroup on EBUSY.
- cgroup: ignore devices errors when running in a user namespace.
- seccomp: drop SECCOMP_FILTER_FLAG_LOG by default.
- seccomp: report correct action in error message.
- apply SELinux label to keyring.
- add custom annotation run.oci.delegate-cgroup.
- close_range fallbacks to close on EPERM.
- report error if the cgroup path was set and the cgroup could not be
  joined.

* crun-0.19.1

- on exec, honor additional_gids from the process spec, not the
  container definition.
- spec: add cgroup ns if on cgroup v2.
- systemd: support array of strings for cgroup annotation.

* crun-0.19

- join all the cgroup v1 controllers.
- raise a warning when newuidmap/newgidmap fail.
- handle eBPF access(dev_name, F_OK) call correctly.
- fix some memory leaks on errors when libcrun is used by a long
  running process.
- fix the SELinux label for masked directories.
- support default seccomp errno value.
- fail if no default seccomp action specified.
- support OCI seccomp notify listener.
- improve OOM error messages.
- ignore unknown capabilities and raise a warning.
- always remount bind mounts to drop not requested mount flags.

* crun-0.18

- fix build without CLONE_NEWCGROUP.
- fix conversion from blkio to io.
- add custom annotation to load raw BPF.
- set working directory for libkrun
- fix symlink lookup on old kernels that lack openat2
- skip +cpu on EINVAL in cgroup root.  Enabling the cpu controller is
  not permitted if there are already realtime processes running on the
  system.
- Fix permission error when using NOTIFY_SOCKET with username spaces.
- set HOME to root if the user not found.
- simplify mount logic to not use a temporary mount.
- ignore ENOSYS from keyctl.

* crun-0.17

- allow creating user namespaces without root being mapped.
- allow arbitrary IDs with single ID userns.
- use close_range(CLOSE_RANGE_CLOEXEC) where available.
- honor /sys/kernel/cgroup/delegate.
- fix an issue with hooks running in the container PID namespace.
- fix building without seccomp.
- fix building without libcap.

* crun-0.16

- CRIU support.
- fallback to openat if openat2 returns EPERM.
- ignore ENOENT for cgroup v1 mounts, if the mount fails with
  ENOENT, the controller might have been unmounted.
- fix another race reading cgroup freeze.  Reading from the cgroup
  fails with ENODEV if the cgroup was deleted in the meanwhile.

* crun-0.15.1

- add experimental support for libkrun.
- fix check for pidfd availability on older kernels.
- linux: do not set data when remounting read-only.  Fix 'ro' mounts
  on older kernels when SELinux is enabled.
- linux: label the cgroup v1 tmpfs when SELinux is enabled.
- container: truncate the pid file before writing to it.
- exec: fix check for read bytes from the sync socket.
- check the process has a cgroup before allowing pause and resume.
- linux: always create a user namespace if not running with euid == 0.
- libcrun can use a hook instead of executing a container process.
- use libyajl to generate hooks json input.
- handle correctly ENOENT for seccomp notifications.

* crun-0.15

- add support for OCI unified cgroup v2.
- add json format option to `crun list`.
- get last kernel capability dynamically instead of using a build
  time constant.
- enable all available cgroup controllers.
- support the seccomp SCMP_ACT_LOG action.
- support the seccomp SCMP_ACT_KILL_THREAD action.
- properly set a SELinux label for the mqueue mount.
- `crun kill` uses pidfd when supported.
- experimental support for seccomp notifications.
- fix bundle option for `crun create` and `crun run`.
- allow to declare path to config file.
- check /sys/kernel/security/apparmor when using AppArmor.
- doesn't accept type=bind alone anymore, but require either "bind"
  or "rbind" to be present in the mount flags.

* crun-0.14.1

- fix a regression in crun-0.14 where openat2(2) would fail when bind
  mounting a symlink.
- various small fixes to allow running regression tests outside of
  source tree.

* crun-0.14

- cgroup, systemd: create container under subcgroup.  Now a "/container"
  sub-cgroup is created and fully managed by libcrun.  This is a different
  behaviour than what runc does.
- libcrun: use the openat2 syscall available since Linux 5.6.
- container: allow hooks output to file through an annotation.
- linux: support joining PID/IPC namespace not owned by the user namespace.
  Requires Linux 5.3.
- linux: avoid double fork for creating the init process if not needed.
- linux: fix an issue where the basename for $NOTIFY_SOCKET is different
  than /notify.
- rootless: allow /dev/{tty,ptmx} to be present in linux.devices.
- cgroup: fix an issue on CentOS 7.8 when using net_cls and net_prio.
- seccomp: honor errnoRet from OCI spec runtime.
- exec: set setresuid/setresgid before setting up the terminal.
- cgroup, v2: fix crun update with both --memory -1 --memory-swap -1.
- cgroup, v2: fixing setting unlimited swap.
- cgroup, v2: allow to set unlimited swap per se.
- cgroup, v2: treat negative numbers as "max"
- cgroup, v2: raise error if swap is set without memory limit.
- cgroup: ignore cpu resources if set to 0.
- libcrun: audit errno in crun_make_error calls
- libcrun: fix read_pid_stat usage.
- linux: fix double close on the same file descriptor.
- container: Prevent deletion of not stopped container
- status: Use process start time for identification
- CRIU: several improvements.
- linux: fix path lookups for relative paths containing '/'.
- linux: use the SELinux mount label for the notify socket.
- status: delete doesn't fail if the process already exited.

* crun-0.13

- license: change license to gplv2+ and lgpl2.1+.
- criu: initial support for `container restore`.
- state: If a container is paused, report its state as 'paused'.
- cgroup: use the memory controller to ready PIDs.  The pid controller
  is not available on kernels older than 4.3.
- linux: drop context= for remount.  Older linux versions complain
  when the selinux label is specified on a remount.
- utils: fix mount on not writeable path.
- cgroup: support systemd properties via annotations.
- systemd: do not set hard-code collectmode value.  It can be set
  through an annotation.
- cgroup: write the correct blkio settings.
- exec: do not inherit env variables from main pid.
- ebpf: fix endianness issue on s390x.
- linux: fix recursive mount on cgroup v1.

* crun-0.12.2.1

- when not using a cgroup namespace, mount only the cgroup v1 subpath.

* crun-0.12.2

- do not require read permissions on /
- add support for the "time" namespace via a custom annotation
- fix mount of cgroup v1 when using a cgroup namespace
- set default umask to 0022
- use the correct path for notify socket with "crun run -d"
- always use setsid
- use correct indices for seccomp generation
- fixed several issues with cgroup v2 and the cgroupfs driver

* crun-0.12.1

- fix the order of clone syscall arguments on s390 and cris.
- if no mode is specified use 0666 for devices.
- fix running with a relative bundle directory.
- fix some regressions in the mounts path resolution.
- drop a warning when cgroup are not available for rootless.

* crun-0.12

- masked paths use only MS_UNBINDABLE
- mount doesn't specify mount data when there are no options
- support new hook types: createRuntime, createContainer and startContainer
- safer mount options.  A temporary mount is prepared outside of the
  rootfs before being moved to it.
- apply selinux/apparmor before the pivot_root.
- handle correctly proc remounts.  It is now supported to specify hidepid=
- fix exec if a namespace is not available.
- handle swap limit with the same semantic as on cgroup v1.
- bring network device up.
- reset all signal handlers to default.

* crun-0.11

- cgroups2: map memory reservation to memory.low
- statx fallbacks to stat on EINVAL
- utils: do not fail if the path we are trying to create already
  exists
- generate seccomp profile in the parent process, not in the container
  init process.  Memory usage is more reliable now and a container can
  run with ~250K of max memory.
- support for Linux personality.
- support for umask.
- support for the hugetlb controller on cgroup v2.
- PIDs from a cgroup are read recursively.
- do not fork on "create".
- now by default seccomp doesn't fail on an unknown syscall.  The
  previous behavior can be enabled with an annotation.
- fix joining cgroup on cgroup v2 when a named hierarchy is also
  present.
- fix creating user namespaces with more than 2^32 IDs mapped.
- on exec, keep the SELinux label or AppArmor profile from the
- container configuration.
- runtime specific annotation are prefixed with run.oci.

* crun-0.10.6

- when running with a terminal, change the ownership for the terminal
  to the specified user
- spec: honor the --rootless flag
- linux: make sure the source path is resolved when checking the file
  type.  Regression introduced with 0.10.5.

* crun-0.10.5

- fix CVE-2019-18837
- fix running on CentOS/RHEL 8
- report errors opening the console socket
- not leave config.json around if the container could not be created

* crun-0.10.4

- ignore errors creating /dev/console
- add an annotation "io.crun.keep_original_groups", if it is set then
  crun won't drop additional groups when creating the container

* crun-0.10.3

- systemd: set collectmode=inactive-or-failed
- fix build on Alpine
- use the current working directory to lookup local paths
- improve the error message when a hook fails
- add granular enable/disable configure options

* crun-0.10.2

- fix a regression in 0.10.1 where cgroups v1 could not be created
- correctly chown cgroups when using a user namespace so that systemd
  can run in a container that uses a user namespace

* crun-0.10.1

- linux: Keep MS_RDONLY when remounting bind mount of a read-only
  source.  It solves an issue on Fedora Silverblue where /usr is
  mounted read only.
- fix exec of rootless containers when cgroups are not available

* crun-0.10

- support for AppArmor
- fix for CVE-2019-16884, make sure writes to /proc for the SELinux
  and AppArmor labels are on procfs.
- exec supports --preserve-fds
- seccomp: fix lookup for pseudo syscalls, seccomp now works fine on
  non native archs
- cgroup: ignore rootless errors if manager != systemd
- error: always write errors to stderr
- chroot: follow symlinks for the last component
- set $HOME if it is not already defined

* crun-0.9.1

- fix an issue with tmpcopyup that didn't work correctly with symlinks
- create a new cgroup namespace before mounting the cgroup file
  system, so that it uses the correct namespace

* crun-0.9

- fix exec into containers running systemd on cgroups v2
- kill: honor --all
- kill: when not using a PID namespace, use the freezer controller to
  prevent the container forking new processes
- linux: handle tmpcopyup option to copy files from the rootfs to the
  new mounted tmpfs.
- OCI: honor seccomp options.  If not specified any seccomp option,
  now crun will default to using SECCOMP_FILTER_FLAG_SPEC_ALLOW |
  SECCOMP_FILTER_FLAG_LOG when using the seccomp(2)
  syscall

* crun-0.8

- executable lookup. Now create fails immediately if the specified
  executable doesn't exist
- subreaper enabled only when crun is attached
- fix notify socket when used from create and prevent it hanging
  indefinitely when the container exits
- correctly write cpu controller resources when using cgroups v2
- support for the freezer controller when using cgroups v2
- honor unspecified minor/major number for devices when using cgroups v2
- reintroduce --no-pivot
- do not add a cgroup path again if it was already specified in the
  OCI configuration

* crun-0.7

- support devices on cgroups v2 using eBPF.
- new option --cgroup-manager=MANAGER. Accepted values are cgroupfs,
  systemd and disabled.
- can run without using cgroups also as root.
- NOTIFY_SOCKET works also for containers created via create/start.
- when using systemd, create the same name for the scope as runc does.

* crun-0.6

- tty: set the size on the exec tty.
- cgroup: enable only the controllers needed.
- cgroup: in unified mode report the errors also for rootless.
- cgroup2: add support for the cpuset controller.
- linux: ignore tmpcopyup.

* crun-0.5

- logging: support --log=syslog: and log=journald.
- seccomp: if the syscall is not known, ignore it.
- container: move set oom before entering userns.
- status: always honor XDG_RUNTIME_DIR.
- linux: resolve symlinks in the target for bind mounts.
- fix all issues found by Coverity.
- pass Kubernetes e2e tests on Fedora with CRI-O.

* crun-0.4

- partial support for cgroup v2 (cpu, io, memory, pids controllers).
- pass all the OCI validation tests (https://github.com/opencontainers/runtime-tools).
- implement --log-format. crun now works with containerd.
- fixed some issues that prevented crun to work on older kernels.
