Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package crun for openSUSE:Factory checked in 
at 2024-09-06 17:18:08
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/crun (Old)
 and      /work/SRC/openSUSE:Factory/.crun.new.10096 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "crun"

Fri Sep  6 17:18:08 2024 rev:23 rq:1199004 version:1.16.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/crun/crun.changes        2024-06-06 
12:31:08.713250545 +0200
+++ /work/SRC/openSUSE:Factory/.crun.new.10096/crun.changes     2024-09-06 
17:18:24.611555307 +0200
@@ -1,0 +2,20 @@
+Thu Sep  5 13:18:43 UTC 2024 - Dan Čermák <dcer...@suse.com>
+
+- new upstream release 1.16.1
+
+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.
+
+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
+
+-------------------------------------------------------------------

Old:
----
  crun-1.15.tar.gz
  crun-1.15.tar.gz.asc

New:
----
  crun-1.16.1.tar.gz
  crun-1.16.1.tar.gz.asc

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ crun.spec ++++++
--- /var/tmp/diff_new_pack.3kkyxc/_old  2024-09-06 17:18:25.087575086 +0200
+++ /var/tmp/diff_new_pack.3kkyxc/_new  2024-09-06 17:18:25.087575086 +0200
@@ -23,7 +23,7 @@
 %endif
 
 Name:           crun
-Version:        1.15
+Version:        1.16.1
 Release:        0
 Summary:        OCI runtime written in C
 License:        GPL-2.0-or-later
@@ -86,10 +86,7 @@
 %install
 %make_install
 rm -rf %{buildroot}/%{_libdir}/lib*
-%ifarch x86_64 aarch64
-# allow easy krun usage with podman
-ln -s %{_bindir}/crun %{buildroot}%{_bindir}/krun
-%endif
+
 %if %with_wasmedge
 # platform 'wasi/wasm' requires crun-wasm
 ln -s %{_bindir}/crun %{buildroot}%{_bindir}/crun-wasm

++++++ crun-1.15.tar.gz -> crun-1.16.1.tar.gz ++++++
++++ 1761 lines of diff (skipped)
++++    retrying with extended exclude list
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/.tarball-git-version.h new/crun-1.16.1/.tarball-git-version.h
--- old/crun-1.15/.tarball-git-version.h        2024-05-02 12:52:53.000000000 
+0200
+++ new/crun-1.16.1/.tarball-git-version.h      2024-08-13 16:41:16.000000000 
+0200
@@ -1,4 +1,4 @@
 /* autogenerated.  */
 #ifndef GIT_VERSION
-# define GIT_VERSION "e6eacaf4034e84185fd8780ac9262bbf57082278"
+# define GIT_VERSION "afa829ca0122bd5e1d67f1f38e6cc348027e3c32"
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/.tarball-version new/crun-1.16.1/.tarball-version
--- old/crun-1.15/.tarball-version      2024-05-02 12:52:53.000000000 +0200
+++ new/crun-1.16.1/.tarball-version    2024-08-13 16:41:16.000000000 +0200
@@ -1 +1 @@
-1.15
+1.16.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/Makefile.am new/crun-1.16.1/Makefile.am
--- old/crun-1.15/Makefile.am   2024-01-24 17:31:10.000000000 +0100
+++ new/crun-1.16.1/Makefile.am 2024-08-07 11:59:00.000000000 +0200
@@ -271,6 +271,22 @@
        $(MD2MAN) -in $(abs_srcdir)/krun.1.md -out krun.1
 endif HAVE_MD2MAN
 
+install-exec-hook:
+if ENABLE_KRUN
+       $(LN_S) crun$(EXEEXT) $(DESTDIR)$(bindir)/krun$(EXEEXT)
+endif
+if ENABLE_WASM
+       $(LN_S) crun$(EXEEXT) $(DESTDIR)$(bindir)/crun-wasm$(EXEEXT)
+endif
+
+uninstall-hook:
+if ENABLE_KRUN
+       rm -f $(DESTDIR)$(bindir)/krun$(EXEEXT)
+endif
+if ENABLE_WASM
+       rm -f $(DESTDIR)$(bindir)/crun-wasm$(EXEEXT)
+endif
+
 generate-man: crun.1 krun.1
 
 sync:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/NEWS new/crun-1.16.1/NEWS
--- old/crun-1.15/NEWS  2024-05-02 12:48:57.000000000 +0200
+++ new/crun-1.16.1/NEWS        2024-08-13 16:40:05.000000000 +0200
@@ -1,3 +1,25 @@
+* 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
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/README.md new/crun-1.16.1/README.md
--- old/crun-1.15/README.md     2024-01-24 17:31:10.000000000 +0100
+++ new/crun-1.16.1/README.md   2024-08-07 11:59:00.000000000 +0200
@@ -45,13 +45,10 @@
 # podman --runtime /usr/bin/runc run --rm --memory 4M fedora echo it works
 Error: container_linux.go:346: starting container process caused 
"process_linux.go:327: getting pipe fds for pid 13859 caused \"readlink 
/proc/13859/fd/0: no such file or directory\"": OCI runtime command not found 
error
 
-# podman --runtime /usr/bin/crun run --rm --memory 4M fedora echo it works
+# podman --runtime /usr/bin/crun run --rm --memory 512k fedora echo it works
 it works
 ```
 
-crun could go much lower than that, and require \< 1M. The used 4MB is a
-hard limit set directly in Podman before calling the OCI runtime.
-
 ## Dependencies
 
 These dependencies are required for the build:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/configure.ac new/crun-1.16.1/configure.ac
--- old/crun-1.15/configure.ac  2024-01-24 17:31:10.000000000 +0100
+++ new/crun-1.16.1/configure.ac        2024-08-07 11:59:00.000000000 +0200
@@ -8,6 +8,8 @@
 AC_REQUIRE_AUX_FILE([tap-driver.sh])
 AC_CONFIG_SRCDIR([src/crun.c])
 
+AC_PROG_LN_S
+
 LT_INIT([disable-shared])
 
 AM_INIT_AUTOMAKE([1.11.2 -Wno-portability foreign tar-ustar no-dist-gzip 
dist-xz subdir-objects])
@@ -128,6 +130,8 @@
 
 AM_CONDITIONAL([ENABLE_KRUN], [test "x$with_libkrun" = xyes])
 
+AM_CONDITIONAL([ENABLE_WASM], [test "x$with_wasmer" = xyes && test 
"x$with_wasmedge" = xyes && test "x$with_wasmtime" = xyes])
+
 dnl include support for spin (EXPERIMENTAL)
 AC_ARG_WITH([spin], AS_HELP_STRING([--with-spin], [build with spin support]))
 AS_IF([test "x$with_spin" = "xyes"], AC_DEFINE([HAVE_SPIN], 1, [Define if spin 
is available]))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/libocispec/Makefile.am new/crun-1.16.1/libocispec/Makefile.am
--- old/crun-1.15/libocispec/Makefile.am        2023-04-13 21:08:30.000000000 
+0200
+++ new/crun-1.16.1/libocispec/Makefile.am      2024-08-07 11:59:56.000000000 
+0200
@@ -256,7 +256,8 @@
        runtime-spec \
        image-spec \
        src/ocispec/json_common.h \
-       src/ocispec/json_common.c
+       src/ocispec/json_common.c \
+       src/yajl
 
 sync:
        (cd image-spec; git pull https://github.com/opencontainers/image-spec)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/libocispec/config.h.in new/crun-1.16.1/libocispec/config.h.in
--- old/crun-1.15/libocispec/config.h.in        2024-05-02 12:52:19.000000000 
+0200
+++ new/crun-1.16.1/libocispec/config.h.in      2024-08-13 16:40:40.000000000 
+0200
@@ -30,6 +30,9 @@
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
+/* Define if libyajl is available */
+#undef HAVE_YAJL
+
 /* Define to the sub-directory where libtool stores uninstalled libraries. */
 #undef LT_OBJDIR
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/libocispec/configure.ac new/crun-1.16.1/libocispec/configure.ac
--- old/crun-1.15/libocispec/configure.ac       2022-11-07 11:11:00.000000000 
+0100
+++ new/crun-1.16.1/libocispec/configure.ac     2024-08-07 11:59:56.000000000 
+0200
@@ -25,7 +25,10 @@
 esac],[embedded_yajl=false])
 
 AM_CONDITIONAL([HAVE_EMBEDDED_YAJL], [test x"$embedded_yajl" = xtrue])
-AM_COND_IF([HAVE_EMBEDDED_YAJL], [], [PKG_CHECK_MODULES([YAJL], [yajl >= 
2.1.0])])
+AM_COND_IF([HAVE_EMBEDDED_YAJL], [], [
+AC_SEARCH_LIBS(yajl_tree_get, [yajl], [AC_DEFINE([HAVE_YAJL], 1, [Define if 
libyajl is available])], [AC_MSG_ERROR([*** libyajl headers not found])])
+PKG_CHECK_MODULES([YAJL], [yajl >= 2.0.0])
+])
 
 # Optionally install the library.
 AC_ARG_ENABLE(libocispec-install,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/libocispec/src/yajl/yajl_common.h 
new/crun-1.16.1/libocispec/src/yajl/yajl_common.h
--- old/crun-1.15/libocispec/src/yajl/yajl_common.h     1970-01-01 
01:00:00.000000000 +0100
+++ new/crun-1.16.1/libocispec/src/yajl/yajl_common.h   2021-03-21 
20:50:29.000000000 +0100
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2007-2014, Lloyd Hilaiel <m...@lloyd.io>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef __YAJL_COMMON_H__
+#define __YAJL_COMMON_H__
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define YAJL_MAX_DEPTH 128
+
+/* msft dll export gunk.  To build a DLL on windows, you
+ * must define WIN32, YAJL_SHARED, and YAJL_BUILD.  To use a shared
+ * DLL, you must define YAJL_SHARED and WIN32 */
+#if (defined(_WIN32) || defined(WIN32)) && defined(YAJL_SHARED)
+#  ifdef YAJL_BUILD
+#    define YAJL_API __declspec(dllexport)
+#  else
+#    define YAJL_API __declspec(dllimport)
+#  endif
+#else
+#  if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 303
+#    define YAJL_API __attribute__ ((visibility("default")))
+#  else
+#    define YAJL_API
+#  endif
+#endif
+
+/** pointer to a malloc function, supporting client overriding memory
+ *  allocation routines */
+typedef void * (*yajl_malloc_func)(void *ctx, size_t sz);
+
+/** pointer to a free function, supporting client overriding memory
+ *  allocation routines */
+typedef void (*yajl_free_func)(void *ctx, void * ptr);
+
+/** pointer to a realloc function which can resize an allocation. */
+typedef void * (*yajl_realloc_func)(void *ctx, void * ptr, size_t sz);
+
+/** A structure which can be passed to yajl_*_alloc routines to allow the
+ *  client to specify memory allocation functions to be used. */
+typedef struct
+{
+    /** pointer to a function that can allocate uninitialized memory */
+    yajl_malloc_func malloc;
+    /** pointer to a function that can resize memory allocations */
+    yajl_realloc_func realloc;
+    /** pointer to a function that can free memory allocated using
+     *  reallocFunction or mallocFunction */
+    yajl_free_func free;
+    /** a context pointer that will be passed to above allocation routines */
+    void * ctx;
+} yajl_alloc_funcs;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/libocispec/src/yajl/yajl_gen.h 
new/crun-1.16.1/libocispec/src/yajl/yajl_gen.h
--- old/crun-1.15/libocispec/src/yajl/yajl_gen.h        1970-01-01 
01:00:00.000000000 +0100
+++ new/crun-1.16.1/libocispec/src/yajl/yajl_gen.h      2021-03-21 
20:50:29.000000000 +0100
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2007-2014, Lloyd Hilaiel <m...@lloyd.io>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * \file yajl_gen.h
+ * Interface to YAJL's JSON generation facilities.
+ */
+
+#include <yajl/yajl_common.h>
+
+#ifndef __YAJL_GEN_H__
+#define __YAJL_GEN_H__
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+    /** generator status codes */
+    typedef enum {
+        /** no error */
+        yajl_gen_status_ok = 0,
+        /** at a point where a map key is generated, a function other than
+         *  yajl_gen_string was called */
+        yajl_gen_keys_must_be_strings,
+        /** YAJL's maximum generation depth was exceeded.  see
+         *  YAJL_MAX_DEPTH */
+        yajl_max_depth_exceeded,
+        /** A generator function (yajl_gen_XXX) was called while in an error
+         *  state */
+        yajl_gen_in_error_state,
+        /** A complete JSON document has been generated */
+        yajl_gen_generation_complete,
+        /** yajl_gen_double was passed an invalid floating point value
+         *  (infinity or NaN). */
+        yajl_gen_invalid_number,
+        /** A print callback was passed in, so there is no internal
+         * buffer to get from */
+        yajl_gen_no_buf,
+        /** returned from yajl_gen_string() when the yajl_gen_validate_utf8
+         *  option is enabled and an invalid was passed by client code.
+         */
+        yajl_gen_invalid_string
+    } yajl_gen_status;
+
+    /** an opaque handle to a generator */
+    typedef struct yajl_gen_t * yajl_gen;
+
+    /** a callback used for "printing" the results. */
+    typedef void (*yajl_print_t)(void * ctx,
+                                 const char * str,
+                                 size_t len);
+
+    /** configuration parameters for the parser, these may be passed to
+     *  yajl_gen_config() along with option specific argument(s).  In general,
+     *  all configuration parameters default to *off*. */
+    typedef enum {
+        /** generate indented (beautiful) output */
+        yajl_gen_beautify = 0x01,
+        /**
+         * Set an indent string which is used when yajl_gen_beautify
+         * is enabled.  Maybe something like \\t or some number of
+         * spaces.  The default is four spaces ' '.
+         */
+        yajl_gen_indent_string = 0x02,
+        /**
+         * Set a function and context argument that should be used to
+         * output generated json.  the function should conform to the
+         * yajl_print_t prototype while the context argument is a
+         * void * of your choosing.
+         *
+         * example:
+         *   yajl_gen_config(g, yajl_gen_print_callback, myFunc, myVoidPtr);
+         */
+        yajl_gen_print_callback = 0x04,
+        /**
+         * Normally the generator does not validate that strings you
+         * pass to it via yajl_gen_string() are valid UTF8.  Enabling
+         * this option will cause it to do so.
+         */
+        yajl_gen_validate_utf8 = 0x08,
+        /**
+         * the forward solidus (slash or '/' in human) is not required to be
+         * escaped in json text.  By default, YAJL will not escape it in the
+         * iterest of saving bytes.  Setting this flag will cause YAJL to
+         * always escape '/' in generated JSON strings.
+         */
+        yajl_gen_escape_solidus = 0x10
+    } yajl_gen_option;
+
+    /** allow the modification of generator options subsequent to handle
+     *  allocation (via yajl_alloc)
+     *  \returns zero in case of errors, non-zero otherwise
+     */
+    YAJL_API int yajl_gen_config(yajl_gen g, yajl_gen_option opt, ...);
+
+    /** allocate a generator handle
+     *  \param allocFuncs an optional pointer to a structure which allows
+     *                    the client to overide the memory allocation
+     *                    used by yajl.  May be NULL, in which case
+     *                    malloc/free/realloc will be used.
+     *
+     *  \returns an allocated handle on success, NULL on failure (bad params)
+     */
+    YAJL_API yajl_gen yajl_gen_alloc(const yajl_alloc_funcs * allocFuncs);
+
+    /** free a generator handle */
+    YAJL_API void yajl_gen_free(yajl_gen handle);
+
+    YAJL_API yajl_gen_status yajl_gen_integer(yajl_gen hand, long long int 
number);
+    /** generate a floating point number.  number may not be infinity or
+     *  NaN, as these have no representation in JSON.  In these cases the
+     *  generator will return 'yajl_gen_invalid_number' */
+    YAJL_API yajl_gen_status yajl_gen_double(yajl_gen hand, double number);
+    YAJL_API yajl_gen_status yajl_gen_number(yajl_gen hand,
+                                             const char * num,
+                                             size_t len);
+    YAJL_API yajl_gen_status yajl_gen_string(yajl_gen hand,
+                                             const unsigned char * str,
+                                             size_t len);
+    YAJL_API yajl_gen_status yajl_gen_null(yajl_gen hand);
+    YAJL_API yajl_gen_status yajl_gen_bool(yajl_gen hand, int boolean);
+    YAJL_API yajl_gen_status yajl_gen_map_open(yajl_gen hand);
+    YAJL_API yajl_gen_status yajl_gen_map_close(yajl_gen hand);
+    YAJL_API yajl_gen_status yajl_gen_array_open(yajl_gen hand);
+    YAJL_API yajl_gen_status yajl_gen_array_close(yajl_gen hand);
+
+    /** access the null terminated generator buffer.  If incrementally
+     *  outputing JSON, one should call yajl_gen_clear to clear the
+     *  buffer.  This allows stream generation. */
+    YAJL_API yajl_gen_status yajl_gen_get_buf(yajl_gen hand,
+                                              const unsigned char ** buf,
+                                              size_t * len);
+
+    /** clear yajl's output buffer, but maintain all internal generation
+     *  state.  This function will not "reset" the generator state, and is
+     *  intended to enable incremental JSON outputing. */
+    YAJL_API void yajl_gen_clear(yajl_gen hand);
+
+    /** Reset the generator state.  Allows a client to generate multiple
+     *  json entities in a stream. The "sep" string will be inserted to
+     *  separate the previously generated entity from the current,
+     *  NULL means *no separation* of entites (clients beware, generating
+     *  multiple JSON numbers without a separator, for instance, will result 
in ambiguous output)
+     *
+     *  Note: this call will not clear yajl's output buffer.  This
+     *  may be accomplished explicitly by calling yajl_gen_clear() */
+    YAJL_API void yajl_gen_reset(yajl_gen hand, const char * sep);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/libocispec/src/yajl/yajl_parse.h 
new/crun-1.16.1/libocispec/src/yajl/yajl_parse.h
--- old/crun-1.15/libocispec/src/yajl/yajl_parse.h      1970-01-01 
01:00:00.000000000 +0100
+++ new/crun-1.16.1/libocispec/src/yajl/yajl_parse.h    2021-03-21 
20:50:29.000000000 +0100
@@ -0,0 +1,226 @@
+/*
+ * Copyright (c) 2007-2014, Lloyd Hilaiel <m...@lloyd.io>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * \file yajl_parse.h
+ * Interface to YAJL's JSON stream parsing facilities.
+ */
+
+#include <yajl/yajl_common.h>
+
+#ifndef __YAJL_PARSE_H__
+#define __YAJL_PARSE_H__
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+    /** error codes returned from this interface */
+    typedef enum {
+        /** no error was encountered */
+        yajl_status_ok,
+        /** a client callback returned zero, stopping the parse */
+        yajl_status_client_canceled,
+        /** An error occurred during the parse.  Call yajl_get_error for
+         *  more information about the encountered error */
+        yajl_status_error
+    } yajl_status;
+
+    /** attain a human readable, english, string for an error */
+    YAJL_API const char * yajl_status_to_string(yajl_status code);
+
+    /** an opaque handle to a parser */
+    typedef struct yajl_handle_t * yajl_handle;
+
+    /** yajl is an event driven parser.  this means as json elements are
+     *  parsed, you are called back to do something with the data.  The
+     *  functions in this table indicate the various events for which
+     *  you will be called back.  Each callback accepts a "context"
+     *  pointer, this is a void * that is passed into the yajl_parse
+     *  function which the client code may use to pass around context.
+     *
+     *  All callbacks return an integer.  If non-zero, the parse will
+     *  continue.  If zero, the parse will be canceled and
+     *  yajl_status_client_canceled will be returned from the parse.
+     *
+     *  \attention {
+     *    A note about the handling of numbers:
+     *
+     *    yajl will only convert numbers that can be represented in a
+     *    double or a 64 bit (long long) int.  All other numbers will
+     *    be passed to the client in string form using the yajl_number
+     *    callback.  Furthermore, if yajl_number is not NULL, it will
+     *    always be used to return numbers, that is yajl_integer and
+     *    yajl_double will be ignored.  If yajl_number is NULL but one
+     *    of yajl_integer or yajl_double are defined, parsing of a
+     *    number larger than is representable in a double or 64 bit
+     *    integer will result in a parse error.
+     *  }
+     */
+    typedef struct {
+        int (* yajl_null)(void * ctx);
+        int (* yajl_boolean)(void * ctx, int boolVal);
+        int (* yajl_integer)(void * ctx, long long integerVal);
+        int (* yajl_double)(void * ctx, double doubleVal);
+        /** A callback which passes the string representation of the number
+         *  back to the client.  Will be used for all numbers when present */
+        int (* yajl_number)(void * ctx, const char * numberVal,
+                            size_t numberLen);
+
+        /** strings are returned as pointers into the JSON text when,
+         * possible, as a result, they are _not_ null padded */
+        int (* yajl_string)(void * ctx, const unsigned char * stringVal,
+                            size_t stringLen);
+
+        int (* yajl_start_map)(void * ctx);
+        int (* yajl_map_key)(void * ctx, const unsigned char * key,
+                             size_t stringLen);
+        int (* yajl_end_map)(void * ctx);
+
+        int (* yajl_start_array)(void * ctx);
+        int (* yajl_end_array)(void * ctx);
+    } yajl_callbacks;
+
+    /** allocate a parser handle
+     *  \param callbacks  a yajl callbacks structure specifying the
+     *                    functions to call when different JSON entities
+     *                    are encountered in the input text.  May be NULL,
+     *                    which is only useful for validation.
+     *  \param afs        memory allocation functions, may be NULL for to use
+     *                    C runtime library routines (malloc and friends) 
+     *  \param ctx        a context pointer that will be passed to callbacks.
+     */
+    YAJL_API yajl_handle yajl_alloc(const yajl_callbacks * callbacks,
+                                    yajl_alloc_funcs * afs,
+                                    void * ctx);
+
+
+    /** configuration parameters for the parser, these may be passed to
+     *  yajl_config() along with option specific argument(s).  In general,
+     *  all configuration parameters default to *off*. */
+    typedef enum {
+        /** Ignore javascript style comments present in
+         *  JSON input.  Non-standard, but rather fun
+         *  arguments: toggled off with integer zero, on otherwise.
+         *
+         *  example:
+         *    yajl_config(h, yajl_allow_comments, 1); // turn comment support 
on
+         */
+        yajl_allow_comments = 0x01,
+        /**
+         * When set the parser will verify that all strings in JSON input are
+         * valid UTF8 and will emit a parse error if this is not so.  When set,
+         * this option makes parsing slightly more expensive (~7% depending
+         * on processor and compiler in use)
+         *
+         * example:
+         *   yajl_config(h, yajl_dont_validate_strings, 1); // disable utf8 
checking
+         */
+        yajl_dont_validate_strings     = 0x02,
+        /**
+         * By default, upon calls to yajl_complete_parse(), yajl will
+         * ensure the entire input text was consumed and will raise an error
+         * otherwise.  Enabling this flag will cause yajl to disable this
+         * check.  This can be useful when parsing json out of a that contains 
more
+         * than a single JSON document.
+         */
+        yajl_allow_trailing_garbage = 0x04,
+        /**
+         * Allow multiple values to be parsed by a single handle.  The
+         * entire text must be valid JSON, and values can be seperated
+         * by any kind of whitespace.  This flag will change the
+         * behavior of the parser, and cause it continue parsing after
+         * a value is parsed, rather than transitioning into a
+         * complete state.  This option can be useful when parsing multiple
+         * values from an input stream.
+         */
+        yajl_allow_multiple_values = 0x08,
+        /**
+         * When yajl_complete_parse() is called the parser will
+         * check that the top level value was completely consumed.  I.E.,
+         * if called whilst in the middle of parsing a value
+         * yajl will enter an error state (premature EOF).  Setting this
+         * flag suppresses that check and the corresponding error.
+         */
+        yajl_allow_partial_values = 0x10
+    } yajl_option;
+
+    /** allow the modification of parser options subsequent to handle
+     *  allocation (via yajl_alloc)
+     *  \returns zero in case of errors, non-zero otherwise
+     */
+    YAJL_API int yajl_config(yajl_handle h, yajl_option opt, ...);
+
+    /** free a parser handle */
+    YAJL_API void yajl_free(yajl_handle handle);
+
+    /** Parse some json!
+     *  \param hand - a handle to the json parser allocated with yajl_alloc
+     *  \param jsonText - a pointer to the UTF8 json text to be parsed
+     *  \param jsonTextLength - the length, in bytes, of input text
+     */
+    YAJL_API yajl_status yajl_parse(yajl_handle hand,
+                                    const unsigned char * jsonText,
+                                    size_t jsonTextLength);
+
+    /** Parse any remaining buffered json.
+     *  Since yajl is a stream-based parser, without an explicit end of
+     *  input, yajl sometimes can't decide if content at the end of the
+     *  stream is valid or not.  For example, if "1" has been fed in,
+     *  yajl can't know whether another digit is next or some character
+     *  that would terminate the integer token.
+     *
+     *  \param hand - a handle to the json parser allocated with yajl_alloc
+     */
+    YAJL_API yajl_status yajl_complete_parse(yajl_handle hand);
+
+    /** get an error string describing the state of the
+     *  parse.
+     *
+     *  If verbose is non-zero, the message will include the JSON
+     *  text where the error occurred, along with an arrow pointing to
+     *  the specific char.
+     *
+     *  \returns A dynamically allocated string will be returned which should
+     *  be freed with yajl_free_error
+     */
+    YAJL_API unsigned char * yajl_get_error(yajl_handle hand, int verbose,
+                                            const unsigned char * jsonText,
+                                            size_t jsonTextLength);
+
+    /**
+     * get the amount of data consumed from the last chunk passed to YAJL.
+     *
+     * In the case of a successful parse this can help you understand if
+     * the entire buffer was consumed (which will allow you to handle
+     * "junk at end of input").
+     *
+     * In the event an error is encountered during parsing, this function
+     * affords the client a way to get the offset into the most recent
+     * chunk where the error occurred.  0 will be returned if no error
+     * was encountered.
+     */
+    YAJL_API size_t yajl_get_bytes_consumed(yajl_handle hand);
+
+    /** free an error returned from yajl_get_error */
+    YAJL_API void yajl_free_error(yajl_handle hand, unsigned char * str);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/libocispec/src/yajl/yajl_tree.h 
new/crun-1.16.1/libocispec/src/yajl/yajl_tree.h
--- old/crun-1.15/libocispec/src/yajl/yajl_tree.h       1970-01-01 
01:00:00.000000000 +0100
+++ new/crun-1.16.1/libocispec/src/yajl/yajl_tree.h     2021-03-21 
20:50:29.000000000 +0100
@@ -0,0 +1,186 @@
+/*
+ * Copyright (c) 2010-2011  Florian Forster  <ff at octo.it>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * \file yajl_tree.h
+ *
+ * Parses JSON data and returns the data in tree form.
+ *
+ * \author Florian Forster
+ * \date August 2010
+ *
+ * This interface makes quick parsing and extraction of
+ * smallish JSON docs trivial:
+ *
+ * \include example/parse_config.c
+ */
+
+#ifndef YAJL_TREE_H
+#define YAJL_TREE_H 1
+
+#include <yajl/yajl_common.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** possible data types that a yajl_val_s can hold */
+typedef enum {
+    yajl_t_string = 1,
+    yajl_t_number = 2,
+    yajl_t_object = 3,
+    yajl_t_array = 4,
+    yajl_t_true = 5,
+    yajl_t_false = 6,
+    yajl_t_null = 7,
+    /** The any type isn't valid for yajl_val_s.type, but can be
+     *  used as an argument to routines like yajl_tree_get().
+     */
+    yajl_t_any = 8
+} yajl_type;
+
+#define YAJL_NUMBER_INT_VALID    0x01
+#define YAJL_NUMBER_DOUBLE_VALID 0x02
+
+/** A pointer to a node in the parse tree */
+typedef struct yajl_val_s * yajl_val;
+
+/**
+ * A JSON value representation capable of holding one of the seven
+ * types above. For "string", "number", "object", and "array"
+ * additional data is available in the union.  The "YAJL_IS_*"
+ * and "YAJL_GET_*" macros below allow type checking and convenient
+ * value extraction.
+ */
+struct yajl_val_s
+{
+    /** Type of the value contained. Use the "YAJL_IS_*" macros to check for a
+     * specific type. */
+    yajl_type type;
+    /** Type-specific data. You may use the "YAJL_GET_*" macros to access these
+     * members. */
+    union
+    {
+        char * string;
+        struct {
+            long long i; /*< integer value, if representable. */
+            double  d;   /*< double value, if representable. */
+            char   *r;   /*< unparsed number in string form. */
+            /** Signals whether the \em i and \em d members are
+             * valid. See \c YAJL_NUMBER_INT_VALID and
+             * \c YAJL_NUMBER_DOUBLE_VALID. */
+            unsigned int flags;
+        } number;
+        struct {
+            const char **keys; /*< Array of keys */
+            yajl_val *values; /*< Array of values. */
+            size_t len; /*< Number of key-value-pairs. */
+        } object;
+        struct {
+            yajl_val *values; /*< Array of elements. */
+            size_t len; /*< Number of elements. */
+        } array;
+    } u;
+};
+
+/**
+ * Parse a string.
+ *
+ * Parses an null-terminated string containing JSON data and returns a pointer
+ * to the top-level value (root of the parse tree).
+ *
+ * \param input              Pointer to a null-terminated utf8 string 
containing
+ *                           JSON data.
+ * \param error_buffer       Pointer to a buffer in which an error message will
+ *                           be stored if \em yajl_tree_parse fails, or
+ *                           \c NULL. The buffer will be initialized before
+ *                           parsing, so its content will be destroyed even if
+ *                           \em yajl_tree_parse succeeds.
+ * \param error_buffer_size  Size of the memory area pointed to by
+ *                           \em error_buffer_size. If \em error_buffer_size is
+ *                           \c NULL, this argument is ignored.
+ *
+ * \returns Pointer to the top-level value or \c NULL on error. The memory
+ * pointed to must be freed using \em yajl_tree_free. In case of an error, a
+ * null terminated message describing the error in more detail is stored in
+ * \em error_buffer if it is not \c NULL.
+ */
+YAJL_API yajl_val yajl_tree_parse (const char *input,
+                                   char *error_buffer, size_t 
error_buffer_size);
+
+
+/**
+ * Free a parse tree returned by "yajl_tree_parse".
+ *
+ * \param v Pointer to a JSON value returned by "yajl_tree_parse". Passing NULL
+ * is valid and results in a no-op.
+ */
+YAJL_API void yajl_tree_free (yajl_val v);
+
+/**
+ * Access a nested value inside a tree.
+ *
+ * \param parent the node under which you'd like to extract values.
+ * \param path A null terminated array of strings, each the name of an object 
key
+ * \param type the yajl_type of the object you seek, or yajl_t_any if any will 
do.
+ *
+ * \returns a pointer to the found value, or NULL if we came up empty.
+ *
+ * Future Ideas:  it'd be nice to move path to a string and implement support 
for
+ * a teeny tiny micro language here, so you can extract array elements, do 
things
+ * like .first and .last, even .length.  Inspiration from JSONPath and css 
selectors?
+ * No it wouldn't be fast, but that's not what this API is about.
+ */
+YAJL_API yajl_val yajl_tree_get(yajl_val parent, const char ** path, yajl_type 
type);
+
+/* Various convenience macros to check the type of a `yajl_val` */
+#define YAJL_IS_STRING(v) (((v) != NULL) && ((v)->type == yajl_t_string))
+#define YAJL_IS_NUMBER(v) (((v) != NULL) && ((v)->type == yajl_t_number))
+#define YAJL_IS_INTEGER(v) (YAJL_IS_NUMBER(v) && ((v)->u.number.flags & 
YAJL_NUMBER_INT_VALID))
+#define YAJL_IS_DOUBLE(v) (YAJL_IS_NUMBER(v) && ((v)->u.number.flags & 
YAJL_NUMBER_DOUBLE_VALID))
+#define YAJL_IS_OBJECT(v) (((v) != NULL) && ((v)->type == yajl_t_object))
+#define YAJL_IS_ARRAY(v)  (((v) != NULL) && ((v)->type == yajl_t_array ))
+#define YAJL_IS_TRUE(v)   (((v) != NULL) && ((v)->type == yajl_t_true  ))
+#define YAJL_IS_FALSE(v)  (((v) != NULL) && ((v)->type == yajl_t_false ))
+#define YAJL_IS_NULL(v)   (((v) != NULL) && ((v)->type == yajl_t_null  ))
+
+/** Given a yajl_val_string return a ptr to the bare string it contains,
+ *  or NULL if the value is not a string. */
+#define YAJL_GET_STRING(v) (YAJL_IS_STRING(v) ? (v)->u.string : NULL)
+
+/** Get the string representation of a number.  You should check type first,
+ *  perhaps using YAJL_IS_NUMBER */
+#define YAJL_GET_NUMBER(v) ((v)->u.number.r)
+
+/** Get the double representation of a number.  You should check type first,
+ *  perhaps using YAJL_IS_DOUBLE */
+#define YAJL_GET_DOUBLE(v) ((v)->u.number.d)
+
+/** Get the 64bit (long long) integer representation of a number.  You should
+ *  check type first, perhaps using YAJL_IS_INTEGER */
+#define YAJL_GET_INTEGER(v) ((v)->u.number.i)
+
+/** Get a pointer to a yajl_val_object or NULL if the value is not an object. 
*/
+#define YAJL_GET_OBJECT(v) (YAJL_IS_OBJECT(v) ? &(v)->u.object : NULL)
+
+/** Get a pointer to a yajl_val_array or NULL if the value is not an object. */
+#define YAJL_GET_ARRAY(v)  (YAJL_IS_ARRAY(v)  ? &(v)->u.array  : NULL)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* YAJL_TREE_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/libocispec/src/yajl/yajl_version.h.cmake 
new/crun-1.16.1/libocispec/src/yajl/yajl_version.h.cmake
--- old/crun-1.15/libocispec/src/yajl/yajl_version.h.cmake      1970-01-01 
01:00:00.000000000 +0100
+++ new/crun-1.16.1/libocispec/src/yajl/yajl_version.h.cmake    2021-03-21 
20:50:29.000000000 +0100
@@ -0,0 +1,23 @@
+#ifndef YAJL_VERSION_H_
+#define YAJL_VERSION_H_
+
+#include <yajl/yajl_common.h>
+
+#define YAJL_MAJOR ${YAJL_MAJOR}
+#define YAJL_MINOR ${YAJL_MINOR}
+#define YAJL_MICRO ${YAJL_MICRO}
+
+#define YAJL_VERSION ((YAJL_MAJOR * 10000) + (YAJL_MINOR * 100) + YAJL_MICRO)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int YAJL_API yajl_version(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* YAJL_VERSION_H_ */
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/rpm/crun.spec new/crun-1.16.1/rpm/crun.spec
--- old/crun-1.15/rpm/crun.spec 2024-05-02 12:48:57.000000000 +0200
+++ new/crun-1.16.1/rpm/crun.spec       2024-08-07 11:59:00.000000000 +0200
@@ -1,16 +1,17 @@
 %global krun_opts %{nil}
 %global wasmedge_opts %{nil}
-%global wasmtime_opts %{nil}
 
 # krun and wasm[edge,time] support only on aarch64 and x86_64
 %ifarch aarch64 || x86_64
 %global wasm_support 1
 
-%if %{defined copr_project}
+%if %{defined copr_username}
 %define copr_build 1
 %endif
 
-%if %{defined fedora} || %{defined copr_build}
+# Disable wasmedge on rhel 10 until EPEL10 is in place, otherwise it causes
+# build issues on copr
+%if %{defined fedora} || (%{defined %copr_build} && %{defined rhel} && 
0%{?rhel} < 10)
 %global wasmedge_support 1
 %global wasmedge_opts --with-wasmedge
 %endif
@@ -21,12 +22,6 @@
 %global krun_opts --with-libkrun
 %endif
 
-# wasmtime exists only on podman-next copr for now
-%if %{defined copr_project} && "%{?copr_project}" == "podman-next"
-%global wasmtime_support 1
-%global wasmtime_opts --with-wasmtime
-%endif
-
 %endif
 
 Summary: OCI runtime written in C
@@ -71,9 +66,6 @@
 %if %{defined wasmedge_support}
 BuildRequires: wasmedge-devel
 %endif
-%if %{defined wasmtime_support}
-BuildRequires: wasmtime-c-api-devel
-%endif
 BuildRequires: python
 Provides: oci-runtime
 
@@ -113,17 +105,13 @@
 
 %build
 ./autogen.sh
-./configure --disable-silent-rules %{krun_opts} %{wasmedge_opts} 
%{wasmtime_opts}
+./configure --disable-silent-rules %{krun_opts} %{wasmedge_opts}
 %make_build
 
 %install
 %make_install prefix=%{_prefix}
 rm -rf %{buildroot}%{_prefix}/lib*
 
-%if %{defined krun_support}
-ln -s %{name} %{buildroot}%{_bindir}/krun
-%endif
-
 %if %{defined wasm_support}
 ln -s %{name} %{buildroot}%{_bindir}/%{name}-wasm
 %endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/src/libcrun/blake3/blake3.c 
new/crun-1.16.1/src/libcrun/blake3/blake3.c
--- old/crun-1.15/src/libcrun/blake3/blake3.c   2024-01-24 17:31:10.000000000 
+0100
+++ new/crun-1.16.1/src/libcrun/blake3/blake3.c 2024-08-07 11:59:00.000000000 
+0200
@@ -174,7 +174,7 @@
   assert(input_len <= MAX_SIMD_DEGREE * BLAKE3_CHUNK_LEN);
 #endif
 
-  const uint8_t *chunks_array[MAX_SIMD_DEGREE];
+  const uint8_t *chunks_array[MAX_SIMD_DEGREE] = {0, };
   size_t input_position = 0;
   size_t chunks_array_len = 0;
   while (input_len - input_position >= BLAKE3_CHUNK_LEN) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/src/libcrun/cgroup-systemd.c 
new/crun-1.16.1/src/libcrun/cgroup-systemd.c
--- old/crun-1.15/src/libcrun/cgroup-systemd.c  2024-02-08 19:12:09.000000000 
+0100
+++ new/crun-1.16.1/src/libcrun/cgroup-systemd.c        2024-08-13 
16:40:05.000000000 +0200
@@ -871,14 +871,14 @@
     return ret;
   if (ret)
     {
-      sd_err = sd_bus_message_append (m, "(sv)", "MemoryLimit", "t", 
memory_limit);
+      sd_err = sd_bus_message_append (m, "(sv)", "MemoryMax", "t", 
memory_limit);
       if (UNLIKELY (sd_err < 0))
-        return crun_make_error (err, -sd_err, "sd-bus message append 
MemoryLimit");
+        return crun_make_error (err, -sd_err, "sd-bus message append 
MemoryMax");
     }
 
   if (resources->cpu)
     {
-      /* do not bother with systemd internal representation if both values are 
not specified */
+      /* do not bother with systemd internal representation unless both values 
are specified */
       if (resources->cpu->quota && resources->cpu->period)
         {
           uint64_t quota = resources->cpu->quota;
@@ -889,12 +889,12 @@
             quota = ((quota / 10000) + 1) * 10000;
 
           sd_err = sd_bus_message_append (m, "(sv)", "CPUQuotaPerSecUSec", 
"t", quota);
-          if (UNLIKELY (ret < 0))
-            return ret;
+          if (UNLIKELY (sd_err < 0))
+            return crun_make_error (err, -sd_err, "sd-bus message append 
CPUQuotaPerSecUSec");
 
           sd_err = sd_bus_message_append (m, "(sv)", "CPUQuotaPeriodUSec", 
"t", resources->cpu->period);
-          if (UNLIKELY (ret < 0))
-            return ret;
+          if (UNLIKELY (sd_err < 0))
+            return crun_make_error (err, -sd_err, "sd-bus message append 
CPUQuotaPeriodUSec");
         }
     }
 
@@ -1106,6 +1106,11 @@
     }
 
   sd_err = sd_bus_message_append (m, "(sv)", "DefaultDependencies", "b", 0);
+  if (UNLIKELY (sd_err < 0))
+    {
+      ret = crun_make_error (err, -sd_err, "sd-bus message append 
DefaultDependencies");
+      goto exit;
+    }
 
   for (i = 0; boolean_opts[i]; i++)
     {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/src/libcrun/cgroup-utils.c 
new/crun-1.16.1/src/libcrun/cgroup-utils.c
--- old/crun-1.15/src/libcrun/cgroup-utils.c    2024-05-02 12:48:57.000000000 
+0200
+++ new/crun-1.16.1/src/libcrun/cgroup-utils.c  2024-08-13 16:40:05.000000000 
+0200
@@ -585,6 +585,8 @@
     return ret;
 
   dfd = open (cgroup_path, O_CLOEXEC | O_PATH);
+  if (UNLIKELY (dfd < 0))
+    return crun_make_error (err, errno, "open `%s`", cgroup_path);
 
   ret = read_all_file ("/sys/kernel/cgroup/delegate", &delegate, 
&delegate_size, err);
   if (UNLIKELY (ret < 0))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/src/libcrun/cgroup.c new/crun-1.16.1/src/libcrun/cgroup.c
--- old/crun-1.15/src/libcrun/cgroup.c  2023-09-27 22:33:35.000000000 +0200
+++ new/crun-1.16.1/src/libcrun/cgroup.c        2024-08-13 16:40:05.000000000 
+0200
@@ -470,13 +470,12 @@
 libcrun_cgroup_has_oom (struct libcrun_cgroup_status *status, libcrun_error_t 
*err)
 {
   cleanup_free char *content = NULL;
-  const char *path = NULL;
+  const char *path = status->path;
   const char *prefix = NULL;
   size_t content_size = 0;
   int cgroup_mode;
   char *it;
 
-  path = status->path;
   if (UNLIKELY (path == NULL || path[0] == '\0'))
     return 0;
 
@@ -484,9 +483,6 @@
   if (UNLIKELY (cgroup_mode < 0))
     return cgroup_mode;
 
-  if (path == NULL || path[0] == '\0')
-    return 0;
-
   switch (cgroup_mode)
     {
     case CGROUP_MODE_UNIFIED:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/src/libcrun/container.c new/crun-1.16.1/src/libcrun/container.c
--- old/crun-1.15/src/libcrun/container.c       2024-05-02 12:48:57.000000000 
+0200
+++ new/crun-1.16.1/src/libcrun/container.c     2024-08-13 16:40:05.000000000 
+0200
@@ -1075,7 +1075,27 @@
       if (UNLIKELY (rootfs == NULL))
         {
           /* If realpath failed for any reason, try the relative directory.  */
-          rootfs = xstrdup (def->root->path);
+          if (def->root->path[0] == '/')
+            {
+              cleanup_free char *cwd = NULL;
+              ssize_t len;
+
+              len = safe_readlinkat (AT_FDCWD, "/proc/self/cwd", &cwd, 0, err);
+              if (UNLIKELY (len < 0))
+                return len;
+
+              /* If the rootfs is under the current working directory, just 
use its relative path.  */
+              if (has_prefix (def->root->path, cwd) && def->root->path[len] == 
'/')
+                {
+                  const char *it = consume_slashes (def->root->path + len);
+                  if (*it)
+                    rootfs = xstrdup (it);
+                }
+            }
+
+          /* If nothing else worked, just use the path as it is.  */
+          if (rootfs == NULL)
+            rootfs = xstrdup (def->root->path);
         }
     }
 
@@ -2427,7 +2447,6 @@
   cg.id = context->id;
   cg.resources = def->linux ? def->linux->resources : NULL;
   cg.annotations = def->annotations;
-  cg.manager = cgroup_manager;
   cg.root_uid = root_uid;
   cg.root_gid = root_gid;
 
@@ -3590,7 +3609,7 @@
   pipefd0 = container_ret_status[0];
   pipefd1 = container_ret_status[1];
 
-  /* If the new process block doesn't specify a SELinux label or AppArmor 
profile, then
+  /* If the new process block doesn't specify a SELinux label, AppArmor 
profile or user, then
      use the configuration from the original config file.  */
   if (container->container_def->process)
     {
@@ -3599,6 +3618,9 @@
 
       if (process->apparmor_profile == NULL && 
container->container_def->process->apparmor_profile)
         process->apparmor_profile = xstrdup 
(container->container_def->process->apparmor_profile);
+
+      if (process->user == NULL && container->container_def->process->user)
+        process->user = container->container_def->process->user;
     }
 
   ret = initialize_security (process, err);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/src/libcrun/custom-handler.c 
new/crun-1.16.1/src/libcrun/custom-handler.c
--- old/crun-1.15/src/libcrun/custom-handler.c  2023-11-23 17:37:16.000000000 
+0100
+++ new/crun-1.16.1/src/libcrun/custom-handler.c        2024-08-07 
11:59:00.000000000 +0200
@@ -299,7 +299,7 @@
       struct custom_handler_s *h;
 
       if (manager == NULL)
-        return crun_make_error (err, 0, "handler requested but no manager 
configured: `%s`", context->handler);
+        return crun_make_error (err, 0, "handler requested but no manager 
configured: `%s`", explicit_handler);
 
       h = handler_by_name (manager, explicit_handler);
       if (h)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/src/libcrun/handlers/wasmedge.c 
new/crun-1.16.1/src/libcrun/handlers/wasmedge.c
--- old/crun-1.15/src/libcrun/handlers/wasmedge.c       2024-05-02 
12:48:57.000000000 +0200
+++ new/crun-1.16.1/src/libcrun/handlers/wasmedge.c     2024-08-07 
11:59:00.000000000 +0200
@@ -174,7 +174,7 @@
   return wasm_can_handle_container (container, err);
 }
 
-// This works only when the plugin folder is present in /usr/lib/wasmedge
+// This works only when the plugin is present in /usr/lib/wasmedge
 static int
 libwasmedge_configure_container (void *cookie arg_unused, enum 
handler_configure_phase phase,
                                  libcrun_context_t *context arg_unused, 
libcrun_container_t *container,
@@ -183,7 +183,18 @@
   int ret;
   runtime_spec_schema_config_schema *def = container->container_def;
 
-  if (getenv ("WASMEDGE_PLUGIN_PATH") == NULL && getenv 
("WASMEDGE_WASINN_PRELOAD") == NULL)
+  char **container_env = def->process->env;
+  bool has_plugin_path = false, has_preload = false;
+
+  for (char **env = container_env; env && *env; env++)
+    {
+      if (strncmp (*env, "WASMEDGE_PLUGIN_PATH=", 21) == 0)
+        has_plugin_path = true;
+      else if (strncmp (*env, "WASMEDGE_WASINN_PRELOAD=", 24) == 0)
+        has_preload = true;
+    }
+
+  if (! has_plugin_path && ! has_preload)
     return 0;
 
   if (phase != HANDLER_CONFIGURE_AFTER_MOUNTS)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/src/libcrun/linux.c new/crun-1.16.1/src/libcrun/linux.c
--- old/crun-1.15/src/libcrun/linux.c   2024-05-02 12:48:57.000000000 +0200
+++ new/crun-1.16.1/src/libcrun/linux.c 2024-08-13 16:40:05.000000000 +0200
@@ -2279,7 +2279,7 @@
           const bool is_dir = S_ISDIR (src_mode);
           cleanup_close int dfd = -1;
 
-          dfd = safe_openat (rootfsfd, rootfs, rootfs_len, target, O_CLOEXEC | 
(is_dir ? O_DIRECTORY : 0), 0, err);
+          dfd = safe_openat (rootfsfd, rootfs, rootfs_len, target, O_RDONLY | 
O_PATH | O_CLOEXEC | (is_dir ? O_DIRECTORY : 0), 0, err);
           if (UNLIKELY (dfd < 0))
             return crun_make_error (err, errno, "open mount target `/%s`", 
target);
 
@@ -2546,37 +2546,46 @@
 static int
 make_parent_mount_private (const char *rootfs, libcrun_error_t *err)
 {
-  cleanup_free char *tmp = xstrdup (rootfs);
-  char *it;
+  cleanup_close int rootfsfd = -1;
+  proc_fd_path_t proc_path;
+  size_t n_slashes = 1;
+  const char *it;
+
+  for (it = rootfs; *it; it++)
+    if (*it == '/')
+      n_slashes++;
+
+  /* rootfs could be a relative path.  */
+  rootfsfd = open (rootfs, O_PATH | O_CLOEXEC);
+  if (UNLIKELY (rootfsfd < 0))
+    return crun_make_error (err, errno, "open `%s`", rootfs);
 
-  for (;;)
+  /* prevent a potential infinite loop.  */
+  while (n_slashes-- > 0)
     {
       int ret;
+      errno = 0;
+      cleanup_close int parentfd = -1;
 
-      ret = mount (NULL, tmp, NULL, MS_PRIVATE, NULL);
+      get_proc_self_fd_path (proc_path, rootfsfd);
+      ret = mount (NULL, proc_path, NULL, MS_PRIVATE, NULL);
       if (ret == 0)
         return 0;
 
-      if (errno == EINVAL)
+      parentfd = openat (rootfsfd, "..", O_PATH | O_CLOEXEC);
+      if (parentfd < 0)
         {
-          it = strrchr (tmp, '/');
-          if (it == NULL)
-            return 0;
-          else if (it != tmp)
-            {
-              *it = '\0';
-              continue;
-            }
-          else
-            {
-              ret = mount (NULL, "/", NULL, MS_PRIVATE, NULL);
-              if (ret == 0)
-                return 0;
-            }
+          ret = faccessat (rootfsfd, "..", X_OK, AT_EACCESS);
+          if (ret != 0)
+            return crun_make_error (err, EACCES, "make `%s` private: a 
component is not accessible", rootfs);
         }
-      return crun_make_error (err, errno, "make `%s` private", tmp);
+
+      close_and_reset (&rootfsfd);
+      rootfsfd = get_and_reset (&parentfd);
     }
-  return 0;
+
+  /* should never get this far.  */
+  return crun_make_error (err, 0, "make `%s` private", rootfs);
 }
 
 int
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/src/libcrun/utils.c new/crun-1.16.1/src/libcrun/utils.c
--- old/crun-1.15/src/libcrun/utils.c   2024-05-02 12:48:57.000000000 +0200
+++ new/crun-1.16.1/src/libcrun/utils.c 2024-08-13 16:40:05.000000000 +0200
@@ -144,16 +144,7 @@
 int
 write_file_with_flags (const char *name, int flags, const void *data, size_t 
len, libcrun_error_t *err)
 {
-  cleanup_close int fd = open (name, O_CLOEXEC | O_WRONLY | flags, 0700);
-  int ret;
-  if (UNLIKELY (fd < 0))
-    return crun_make_error (err, errno, "opening file `%s` for writing", name);
-
-  ret = TEMP_FAILURE_RETRY (write (fd, data, len));
-  if (UNLIKELY (ret < 0))
-    return crun_make_error (err, errno, "writing file `%s`", name);
-
-  return ret;
+  return write_file_at_with_flags (AT_FDCWD, flags, 0700, name, data, len, 
err);
 }
 
 int
@@ -1037,7 +1028,7 @@
 int
 read_all_file_at (int dirfd, const char *path, char **out, size_t *len, 
libcrun_error_t *err)
 {
-  cleanup_close int fd;
+  cleanup_close int fd = -1;
 
   fd = TEMP_FAILURE_RETRY (openat (dirfd, path, O_RDONLY | O_CLOEXEC));
   if (UNLIKELY (fd < 0))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/src/restore.c new/crun-1.16.1/src/restore.c
--- old/crun-1.15/src/restore.c 2023-09-26 16:45:32.000000000 +0200
+++ new/crun-1.16.1/src/restore.c       2024-08-07 11:59:00.000000000 +0200
@@ -64,7 +64,7 @@
         { "detach", 'd', 0, 0, "detach from the container's process", 0 },
         { "pid-file", OPTION_PID_FILE, "FILE", 0, "where to write the PID of 
the container", 0 },
         { "console-socket", OPTION_CONSOLE_SOCKET, "SOCKET", 0,
-          "path to a socket that will receive the master end of the tty", 0 },
+          "path to a socket that will receive the ptmx end of the tty", 0 },
         { "file-locks", OPTION_FILE_LOCKS, 0, 0, "allow file locks", 0 },
         { "manage-cgroups-mode", OPTION_MANAGE_CGROUPS_MODE, "MODE", 0, 
"cgroups mode: 'soft' (default), 'ignore', 'full' and 'strict'", 0 },
         {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/src/run.c new/crun-1.16.1/src/run.c
--- old/crun-1.15/src/run.c     2024-05-02 12:48:57.000000000 +0200
+++ new/crun-1.16.1/src/run.c   2024-08-07 11:59:00.000000000 +0200
@@ -56,7 +56,7 @@
         { "preserve-fds", OPTION_PRESERVE_FDS, "N", 0, "pass additional FDs to 
the container", 0 },
         { "pid-file", OPTION_PID_FILE, "FILE", 0, "where to write the PID of 
the container", 0 },
         { "keep", OPTION_KEEP, 0, 0, "do not delete the container after it 
exits", 0 },
-        { "no-subreaper", OPTION_NO_SUBREAPER, 0, 0, "do not create a 
subreaper process", 0 },
+        { "no-subreaper", OPTION_NO_SUBREAPER, 0, 0, "do not create a 
subreaper process (ignored)", 0 },
         { "no-new-keyring", OPTION_NO_NEW_KEYRING, 0, 0, "keep the same 
session key", 0 },
         { "no-pivot", OPTION_NO_PIVOT, 0, 0, "do not use pivot_root", 0 },
         {
@@ -133,8 +133,6 @@
 
   crun_context.preserve_fds = 0;
   crun_context.listen_fds = 0;
-  /* Check if global handler is configured and pass it down to crun context */
-  crun_context.handler = global_args->handler;
 
   argp_parse (&run_argp, argc, argv, ARGP_IN_ORDER, &first_arg, &crun_context);
   crun_assert_n_args (argc - first_arg, 1, 1);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/tests/init.c new/crun-1.16.1/tests/init.c
--- old/crun-1.15/tests/init.c  2024-01-15 16:54:30.000000000 +0100
+++ new/crun-1.16.1/tests/init.c        2024-08-07 11:59:00.000000000 +0200
@@ -455,6 +455,51 @@
       return 0;
     }
 
+  if (strcmp (argv[1], "type") == 0)
+    {
+      struct stat st;
+
+      if (argc < 3)
+        error (EXIT_FAILURE, 0, "'type' requires two arguments");
+      if (stat (argv[2], &st) < 0)
+        error (EXIT_FAILURE, errno, "stat %s", argv[2]);
+
+      switch (st.st_mode & S_IFMT)
+        {
+        case S_IFBLK:
+          printf ("block device\n");
+          break;
+        case S_IFCHR:
+          printf ("character device\n");
+          break;
+
+        case S_IFDIR:
+          printf ("directory\n");
+          break;
+
+        case S_IFIFO:
+          printf ("FIFO/pipe\n");
+          break;
+
+        case S_IFLNK:
+          printf ("symlink\n");
+          break;
+
+        case S_IFREG:
+          printf ("regular file\n");
+          break;
+
+        case S_IFSOCK:
+          printf ("socket\n");
+          break;
+
+        default:
+          printf ("unknown?\n");
+          break;
+        }
+      return 0;
+    }
+
   if (strcmp (argv[1], "owner") == 0)
     {
       struct stat st;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/crun-1.15/tests/test_mounts.py new/crun-1.16.1/tests/test_mounts.py
--- old/crun-1.15/tests/test_mounts.py  2024-02-29 16:27:13.000000000 +0100
+++ new/crun-1.16.1/tests/test_mounts.py        2024-08-07 11:59:00.000000000 
+0200
@@ -17,6 +17,7 @@
 
 import sys
 import copy
+import socket
 from tests_utils import *
 import tempfile
 
@@ -63,6 +64,41 @@
         return 0
     return -1
 
+def test_mount_fifo():
+    conf = base_config()
+    conf['process']['args'] = ['/init', 'type', '/fifo']
+    add_all_namespaces(conf)
+
+    source_file = os.path.join(get_tests_root(), "a-fifo")
+
+    os.mkfifo(source_file)
+
+    for options in ([], ["ro"], ["rro"]):
+        mount_opt = {"destination": "/fifo", "type": "bind", "source": 
source_file, "options": options + ["bind"]}
+        conf['mounts'].append(mount_opt)
+        out, _ = run_and_get_output(conf, hide_stderr=True)
+        if "FIFO" not in out:
+            return 1
+    return 0
+
+def test_mount_unix_socket():
+    conf = base_config()
+    conf['process']['args'] = ['/init', 'type', '/unix-socket']
+    add_all_namespaces(conf)
+
+    source_file = os.path.join(get_tests_root(), "unix-socket")
+
+    server = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
+    server.bind(source_file)
+
+    for options in ([], ["ro"], ["rro"]):
+        mount_opt = {"destination": "/unix-socket", "type": "bind", "source": 
source_file, "options": options + ["bind"]}
+        conf['mounts'].append(mount_opt)
+        out, _ = run_and_get_output(conf, hide_stderr=True)
+        if "socket" not in out:
+            return 1
+    return 0
+
 def test_mount_tmpfs_permissions():
     def prepare_rootfs(rootfs):
         path = os.path.join(rootfs, "tmp")
@@ -575,6 +611,8 @@
     "mount-sync" : test_mount_sync,
     "mount-dirsync" : test_mount_dirsync,
     "mount-symlink" : test_mount_symlink,
+    "mount-fifo" : test_mount_fifo,
+    "mount-unix-socket" : test_mount_unix_socket,
     "mount-symlink-not-existing" : test_mount_symlink_not_existing,
     "mount-dev" : test_mount_dev,
     "mount-nodev" : test_mount_nodev,

Reply via email to