Fix FTBFS due to glibc 2.36 header changes

There is an implicit function declaration in the compiler errors,
which is why this is related to:

  <https://fedoraproject.org/wiki/Changes/PortingToModernC>
  <https://fedoraproject.org/wiki/Toolchain/PortingToModernC>
This commit is contained in:
Florian Weimer 2022-12-02 07:57:27 +01:00
parent 6a23aad1a3
commit 2a16ebb074
4 changed files with 583 additions and 3 deletions

206
criu-glibc-2.36-1.patch Normal file
View File

@ -0,0 +1,206 @@
commit 1e6e826ffb7ac05f33fa123051c2fc2ddf0f68ea
Author: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
Date: Fri Jul 8 12:36:57 2022 +0000
rseq: fix headers conflict on Mariner GNU/Linux
1. For some reason, Marier distribution headers
not correctly define __GLIBC_HAVE_KERNEL_RSEQ
compile-time constant. It remains undefined,
but in fact header files provides corresponding
rseq types declaration which leads to conflict.
2. Another issue, is that they use uint*_t types
instead of __u* types as in original rseq.h.
This leads to compile time issues like this:
format '%llx' expects argument of type 'long long unsigned int', but argument 5 has type 'uint64_t' {aka 'long unsigned int'}
and we can't even replace %llx to %PRIx64 because it will break
compilation on other distros (like Fedora) with analogical error:
error: format %lx expects argument of type long unsigned int, but argument 6 has type __u64 {aka long long unsigned int}
Let's use our-own struct rseq copy fully equal to the kernel one,
it's safe because this structure is a part of Linux Kernel ABI.
Fixes #1934
Reported-by: Nikola Bojanic
Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
diff --git a/Makefile.config b/Makefile.config
index d46d84f2de72ea35..d113e2246b785fda 100644
--- a/Makefile.config
+++ b/Makefile.config
@@ -78,7 +78,8 @@ export DEFINES += $(FEATURE_DEFINES)
export CFLAGS += $(FEATURE_DEFINES)
FEATURES_LIST := TCP_REPAIR STRLCPY STRLCAT PTRACE_PEEKSIGINFO \
- SETPROCTITLE_INIT MEMFD TCP_REPAIR_WINDOW FSCONFIG MEMFD_CREATE OPENAT2
+ SETPROCTITLE_INIT MEMFD TCP_REPAIR_WINDOW FSCONFIG MEMFD_CREATE \
+ OPENAT2 NO_LIBC_RSEQ_DEFS
# $1 - config name
define gen-feature-test
diff --git a/criu/cr-dump.c b/criu/cr-dump.c
index f58701e5c5e5f975..1bd62bbe3534c92e 100644
--- a/criu/cr-dump.c
+++ b/criu/cr-dump.c
@@ -1034,7 +1034,7 @@ static int dump_task_signals(pid_t pid, struct pstree_item *item)
return 0;
}
-static int read_rseq_cs(pid_t tid, struct __ptrace_rseq_configuration *rseqc, struct rseq_cs *rseq_cs,
+static int read_rseq_cs(pid_t tid, struct __ptrace_rseq_configuration *rseqc, struct criu_rseq_cs *rseq_cs,
struct criu_rseq *rseq)
{
int ret;
@@ -1065,10 +1065,11 @@ static int read_rseq_cs(pid_t tid, struct __ptrace_rseq_configuration *rseqc, st
if (!rseq->rseq_cs)
return 0;
- ret = ptrace_peek_area(tid, rseq_cs, decode_pointer(rseq->rseq_cs), sizeof(struct rseq_cs));
+ ret = ptrace_peek_area(tid, rseq_cs, decode_pointer(rseq->rseq_cs), sizeof(struct criu_rseq_cs));
if (ret) {
pr_err("ptrace_peek_area(%d, %lx, %lx, %lx): fail to read rseq_cs struct\n", tid,
- (unsigned long)rseq_cs, (unsigned long)rseq->rseq_cs, (unsigned long)sizeof(struct rseq_cs));
+ (unsigned long)rseq_cs, (unsigned long)rseq->rseq_cs,
+ (unsigned long)sizeof(struct criu_rseq_cs));
return -1;
}
@@ -1083,7 +1084,7 @@ static int dump_thread_rseq(struct pstree_item *item, int i)
CoreEntry *core = item->core[i];
RseqEntry **rseqep = &core->thread_core->rseq_entry;
struct criu_rseq rseq = {};
- struct rseq_cs *rseq_cs = &dmpi(item)->thread_rseq_cs[i];
+ struct criu_rseq_cs *rseq_cs = &dmpi(item)->thread_rseq_cs[i];
pid_t tid = item->threads[i].real;
/*
@@ -1149,7 +1150,7 @@ err:
static int dump_task_rseq(pid_t pid, struct pstree_item *item)
{
int i;
- struct rseq_cs *thread_rseq_cs;
+ struct criu_rseq_cs *thread_rseq_cs;
/* if rseq() syscall isn't supported then nothing to dump */
if (!kdat.has_rseq)
@@ -1174,7 +1175,7 @@ free_rseq:
return -1;
}
-static bool task_in_rseq(struct rseq_cs *rseq_cs, uint64_t addr)
+static bool task_in_rseq(struct criu_rseq_cs *rseq_cs, uint64_t addr)
{
return addr >= rseq_cs->start_ip && addr < rseq_cs->start_ip + rseq_cs->post_commit_offset;
}
@@ -1182,7 +1183,7 @@ static bool task_in_rseq(struct rseq_cs *rseq_cs, uint64_t addr)
static int fixup_thread_rseq(struct pstree_item *item, int i)
{
CoreEntry *core = item->core[i];
- struct rseq_cs *rseq_cs = &dmpi(item)->thread_rseq_cs[i];
+ struct criu_rseq_cs *rseq_cs = &dmpi(item)->thread_rseq_cs[i];
pid_t tid = item->threads[i].real;
/* equivalent to (struct rseq)->rseq_cs is NULL */
diff --git a/criu/include/linux/rseq.h b/criu/include/linux/rseq.h
index a47876e6695f16a4..5ceefbf8e1b59846 100644
--- a/criu/include/linux/rseq.h
+++ b/criu/include/linux/rseq.h
@@ -9,7 +9,12 @@
#endif
#endif
-#ifndef __GLIBC_HAVE_KERNEL_RSEQ
+#include <linux/types.h>
+#include <asm/byteorder.h>
+
+#include "common/config.h"
+
+#ifdef CONFIG_HAS_NO_LIBC_RSEQ_DEFS
/*
* linux/rseq.h
*
@@ -18,9 +23,6 @@
* Copyright (c) 2015-2018 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
*/
-#include <linux/types.h>
-#include <asm/byteorder.h>
-
enum rseq_cpu_id_state {
RSEQ_CPU_ID_UNINITIALIZED = -1,
RSEQ_CPU_ID_REGISTRATION_FAILED = -2,
@@ -41,13 +43,20 @@ enum rseq_cs_flags {
RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL = (1U << RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL_BIT),
RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE = (1U << RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT),
};
+#endif /* CONFIG_HAS_NO_LIBC_RSEQ_DEFS */
+/*
+ * Let's use our own definition of struct rseq_cs because some distros
+ * (for example Mariner GNU/Linux) declares this structure their-own way.
+ * This makes trouble with inconsistency between printf formatters and
+ * struct rseq_cs field types.
+ */
/*
* struct rseq_cs is aligned on 4 * 8 bytes to ensure it is always
* contained within a single cache-line. It is usually declared as
* link-time constant data.
*/
-struct rseq_cs {
+struct criu_rseq_cs {
/* Version of this structure. */
__u32 version;
/* enum rseq_cs_flags */
@@ -57,7 +66,6 @@ struct rseq_cs {
__u64 post_commit_offset;
__u64 abort_ip;
} __attribute__((aligned(4 * sizeof(__u64))));
-#endif /* __GLIBC_HAVE_KERNEL_RSEQ */
/*
* We have to have our own copy of struct rseq definition because
diff --git a/criu/include/pstree.h b/criu/include/pstree.h
index 8ae750e1af897d02..1137046d43fc0c1d 100644
--- a/criu/include/pstree.h
+++ b/criu/include/pstree.h
@@ -63,7 +63,7 @@ struct dmp_info {
struct parasite_ctl *parasite_ctl;
struct parasite_thread_ctl **thread_ctls;
uint64_t *thread_sp;
- struct rseq_cs *thread_rseq_cs;
+ struct criu_rseq_cs *thread_rseq_cs;
/*
* Although we don't support dumping different struct creds in general,
diff --git a/scripts/feature-tests.mak b/scripts/feature-tests.mak
index 592552cb8e065861..014e893a84a280ce 100644
--- a/scripts/feature-tests.mak
+++ b/scripts/feature-tests.mak
@@ -196,3 +196,22 @@ int main(void)
return 0;
}
endef
+
+define FEATURE_TEST_NO_LIBC_RSEQ_DEFS
+
+#ifdef __has_include
+#if __has_include(\"sys/rseq.h\")
+#include <sys/rseq.h>
+#endif
+#endif
+
+enum rseq_cpu_id_state {
+ RSEQ_CPU_ID_UNINITIALIZED = -1,
+ RSEQ_CPU_ID_REGISTRATION_FAILED = -2,
+};
+
+int main(void)
+{
+ return 0;
+}
+endef

264
criu-glibc-2.36-2.patch Normal file
View File

@ -0,0 +1,264 @@
commit 4c86d6a7d54abb64fc5a15131f3351224e8c071b
Author: Radostin Stoyanov <rstoyanov@fedoraproject.org>
Date: Sun Jul 31 16:07:30 2022 +0000
criu: fix conflicting headers
There are several changes in glibc 2.36 that make sys/mount.h header
incompatible with kernel headers:
https://sourceware.org/glibc/wiki/Release/2.36#Usage_of_.3Clinux.2Fmount.h.3E_and_.3Csys.2Fmount.h.3E
This patch removes conflicting includes for `<linux/mount.h>` and
updates the content of `criu/include/linux/mount.h` to match
`/usr/include/sys/mount.h`. In addition, inline definitions sys_*()
functions have been moved from "linux/mount.h" to "syscall.h" to
avoid conflicts with `uapi/compel/plugins/std/syscall.h` and
`<unistd.h>`. The include for `<linux/aio_abi.h>` has been replaced
with local include to avoid conflicts with `<sys/mount.h>`.
Fixes: #1949
Signed-off-by: Radostin Stoyanov <rstoyanov@fedoraproject.org>
diff --git a/Makefile.config b/Makefile.config
index d113e2246b785fda..270ec61c0f35d462 100644
--- a/Makefile.config
+++ b/Makefile.config
@@ -78,7 +78,7 @@ export DEFINES += $(FEATURE_DEFINES)
export CFLAGS += $(FEATURE_DEFINES)
FEATURES_LIST := TCP_REPAIR STRLCPY STRLCAT PTRACE_PEEKSIGINFO \
- SETPROCTITLE_INIT MEMFD TCP_REPAIR_WINDOW FSCONFIG MEMFD_CREATE \
+ SETPROCTITLE_INIT MEMFD TCP_REPAIR_WINDOW MEMFD_CREATE \
OPENAT2 NO_LIBC_RSEQ_DEFS
# $1 - config name
diff --git a/criu/cgroup.c b/criu/cgroup.c
index e05b0832eddfd25c..325df6a1db27a79f 100644
--- a/criu/cgroup.c
+++ b/criu/cgroup.c
@@ -27,6 +27,7 @@
#include "images/cgroup.pb-c.h"
#include "kerndat.h"
#include "linux/mount.h"
+#include "syscall.h"
/*
* This structure describes set of controller groups
diff --git a/criu/cr-check.c b/criu/cr-check.c
index f589a91da1da8243..0ca80192ce4dea6c 100644
--- a/criu/cr-check.c
+++ b/criu/cr-check.c
@@ -21,7 +21,6 @@
#include <sys/prctl.h>
#include <sched.h>
#include <sys/mount.h>
-#include <linux/aio_abi.h>
#include "../soccr/soccr.h"
@@ -52,6 +51,7 @@
#include "net.h"
#include "restorer.h"
#include "uffd.h"
+#include "linux/aio_abi.h"
#include "images/inventory.pb-c.h"
diff --git a/criu/cr-restore.c b/criu/cr-restore.c
index 9853c05854ac373f..9bbc9ea893f1a755 100644
--- a/criu/cr-restore.c
+++ b/criu/cr-restore.c
@@ -22,7 +22,6 @@
#include <compel/ptrace.h>
#include "common/compiler.h"
-#include "linux/mount.h"
#include "linux/rseq.h"
#include "clone-noasan.h"
@@ -86,6 +85,8 @@
#include <compel/plugins/std/syscall-codes.h>
#include "compel/include/asm/syscall.h"
+#include "linux/mount.h"
+
#include "protobuf.h"
#include "images/sa.pb-c.h"
#include "images/timer.pb-c.h"
diff --git a/criu/include/aio.h b/criu/include/aio.h
index d1655739d9683156..38e70402093fb663 100644
--- a/criu/include/aio.h
+++ b/criu/include/aio.h
@@ -1,7 +1,7 @@
#ifndef __CR_AIO_H__
#define __CR_AIO_H__
-#include <linux/aio_abi.h>
+#include "linux/aio_abi.h"
#include "images/mm.pb-c.h"
unsigned int aio_estimate_nr_reqs(unsigned int size);
int dump_aio_ring(MmEntry *mme, struct vma_area *vma);
diff --git a/criu/include/linux/aio_abi.h b/criu/include/linux/aio_abi.h
new file mode 100644
index 0000000000000000..d9ce787203aeceb7
--- /dev/null
+++ b/criu/include/linux/aio_abi.h
@@ -0,0 +1,14 @@
+#ifndef __LINUX__AIO_ABI_H
+#define __LINUX__AIO_ABI_H
+
+typedef __kernel_ulong_t aio_context_t;
+
+/* read() from /dev/aio returns these structures. */
+struct io_event {
+ __u64 data; /* the data field from the iocb */
+ __u64 obj; /* what iocb this event came from */
+ __s64 res; /* result code for this event */
+ __s64 res2; /* secondary result */
+};
+
+#endif /* __LINUX__AIO_ABI_H */
diff --git a/criu/include/linux/mount.h b/criu/include/linux/mount.h
index 9a3a28b1003103e9..0d55a588cb9a87fa 100644
--- a/criu/include/linux/mount.h
+++ b/criu/include/linux/mount.h
@@ -4,32 +4,34 @@
#include "common/config.h"
#include "compel/plugins/std/syscall-codes.h"
-#ifdef CONFIG_HAS_FSCONFIG
-#include <linux/mount.h>
-#else
+/* Copied from /usr/include/sys/mount.h */
+
+#ifndef FSCONFIG_CMD_CREATE
+/* The type of fsconfig call made. */
enum fsconfig_command {
- FSCONFIG_SET_FLAG = 0, /* Set parameter, supplying no value */
- FSCONFIG_SET_STRING = 1, /* Set parameter, supplying a string value */
- FSCONFIG_SET_BINARY = 2, /* Set parameter, supplying a binary blob value */
- FSCONFIG_SET_PATH = 3, /* Set parameter, supplying an object by path */
- FSCONFIG_SET_PATH_EMPTY = 4, /* Set parameter, supplying an object by (empty) path */
- FSCONFIG_SET_FD = 5, /* Set parameter, supplying an object by fd */
- FSCONFIG_CMD_CREATE = 6, /* Invoke superblock creation */
+ FSCONFIG_SET_FLAG = 0, /* Set parameter, supplying no value */
+#define FSCONFIG_SET_FLAG FSCONFIG_SET_FLAG
+ FSCONFIG_SET_STRING = 1, /* Set parameter, supplying a string value */
+#define FSCONFIG_SET_STRING FSCONFIG_SET_STRING
+ FSCONFIG_SET_BINARY = 2, /* Set parameter, supplying a binary blob value */
+#define FSCONFIG_SET_BINARY FSCONFIG_SET_BINARY
+ FSCONFIG_SET_PATH = 3, /* Set parameter, supplying an object by path */
+#define FSCONFIG_SET_PATH FSCONFIG_SET_PATH
+ FSCONFIG_SET_PATH_EMPTY = 4, /* Set parameter, supplying an object by (empty) path */
+#define FSCONFIG_SET_PATH_EMPTY FSCONFIG_SET_PATH_EMPTY
+ FSCONFIG_SET_FD = 5, /* Set parameter, supplying an object by fd */
+#define FSCONFIG_SET_FD FSCONFIG_SET_FD
+ FSCONFIG_CMD_CREATE = 6, /* Invoke superblock creation */
+#define FSCONFIG_CMD_CREATE FSCONFIG_CMD_CREATE
FSCONFIG_CMD_RECONFIGURE = 7, /* Invoke superblock reconfiguration */
+#define FSCONFIG_CMD_RECONFIGURE FSCONFIG_CMD_RECONFIGURE
};
-#endif
+#endif // FSCONFIG_CMD_CREATE
-static inline int sys_fsopen(const char *fsname, unsigned int flags)
-{
- return syscall(__NR_fsopen, fsname, flags);
-}
-static inline int sys_fsconfig(int fd, unsigned int cmd, const char *key, const char *value, int aux)
-{
- return syscall(__NR_fsconfig, fd, cmd, key, value, aux);
-}
-static inline int sys_fsmount(int fd, unsigned int flags, unsigned int attr_flags)
-{
- return syscall(__NR_fsmount, fd, flags, attr_flags);
-}
+#ifndef MS_MGC_VAL
+/* Magic mount flag number. Has to be or-ed to the flag values. */
+#define MS_MGC_VAL 0xc0ed0000 /* Magic flag number to indicate "new" flags */
+#define MS_MGC_MSK 0xffff0000 /* Magic flag number mask */
+#endif
#endif
diff --git a/criu/include/syscall.h b/criu/include/syscall.h
new file mode 100644
index 0000000000000000..c38d6d971b12e825
--- /dev/null
+++ b/criu/include/syscall.h
@@ -0,0 +1,17 @@
+#ifndef __CR_SYSCALL_H__
+#define __CR_SYSCALL_H__
+
+static inline int sys_fsopen(const char *fsname, unsigned int flags)
+{
+ return syscall(__NR_fsopen, fsname, flags);
+}
+static inline int sys_fsconfig(int fd, unsigned int cmd, const char *key, const char *value, int aux)
+{
+ return syscall(__NR_fsconfig, fd, cmd, key, value, aux);
+}
+static inline int sys_fsmount(int fd, unsigned int flags, unsigned int attr_flags)
+{
+ return syscall(__NR_fsmount, fd, flags, attr_flags);
+}
+
+#endif /* __CR_SYSCALL_H__ */
\ No newline at end of file
diff --git a/criu/pie/parasite.c b/criu/pie/parasite.c
index e7eb1fcb60bdfc60..f75fe13bb6b6283e 100644
--- a/criu/pie/parasite.c
+++ b/criu/pie/parasite.c
@@ -3,7 +3,6 @@
#include <signal.h>
#include <linux/limits.h>
#include <linux/capability.h>
-#include <sys/mount.h>
#include <stdarg.h>
#include <sys/ioctl.h>
#include <sys/uio.h>
@@ -14,6 +13,7 @@
#include "int.h"
#include "types.h"
#include <compel/plugins/std/syscall.h>
+#include "linux/mount.h"
#include "parasite.h"
#include "fcntl.h"
#include "prctl.h"
diff --git a/criu/util.c b/criu/util.c
index 5f69465b44ee4b9b..060ca3bd44707ca2 100644
--- a/criu/util.c
+++ b/criu/util.c
@@ -40,6 +40,7 @@
#include "mem.h"
#include "namespaces.h"
#include "criu-log.h"
+#include "syscall.h"
#include "clone-noasan.h"
#include "cr_options.h"
diff --git a/scripts/feature-tests.mak b/scripts/feature-tests.mak
index 014e893a84a280ce..fb5d2ef7ad95ab7e 100644
--- a/scripts/feature-tests.mak
+++ b/scripts/feature-tests.mak
@@ -137,19 +137,6 @@ ENTRY(main)
END(main)
endef
-define FEATURE_TEST_FSCONFIG
-
-#include <linux/mount.h>
-
-int main(void)
-{
- if (FSCONFIG_CMD_CREATE > 0)
- return 0;
- return 0;
-}
-
-endef
-
define FEATURE_TEST_NFTABLES_LIB_API_0
#include <string.h>

101
criu-glibc-2.36-3.patch Normal file
View File

@ -0,0 +1,101 @@
commit 517c0947050e63aac72f63a3bf373d76264723b9
Author: Radostin Stoyanov <rstoyanov@fedoraproject.org>
Date: Wed Aug 24 21:20:30 2022 +0200
mount: add definition for FSOPEN_CLOEXEC
A recent change in glibc introduced `enum fsconfig_command` [1] and as a
result the compilation of criu fails with the following errors
In file included from criu/pie/util.c:3:
/usr/include/sys/mount.h:240:6: error: redeclaration of 'enum fsconfig_command'
240 | enum fsconfig_command
| ^~~~~~~~~~~~~~~~
In file included from /usr/include/sys/mount.h:32:
criu/include/linux/mount.h:11:6: note: originally defined here
11 | enum fsconfig_command {
| ^~~~~~~~~~~~~~~~
/usr/include/sys/mount.h:242:3: error: redeclaration of enumerator 'FSCONFIG_SET_FLAG'
242 | FSCONFIG_SET_FLAG = 0, /* Set parameter, supplying no value */
| ^~~~~~~~~~~~~~~~~
criu/include/linux/mount.h:12:9: note: previous definition of 'FSCONFIG_SET_FLAG' with type 'enum fsconfig_command'
12 | FSCONFIG_SET_FLAG = 0, /* Set parameter, supplying no value */
| ^~~~~~~~~~~~~~~~~
/usr/include/sys/mount.h:244:3: error: redeclaration of enumerator 'FSCONFIG_SET_STRING'
244 | FSCONFIG_SET_STRING = 1, /* Set parameter, supplying a string value */
| ^~~~~~~~~~~~~~~~~~~
criu/include/linux/mount.h:14:9: note: previous definition of 'FSCONFIG_SET_STRING' with type 'enum fsconfig_command'
14 | FSCONFIG_SET_STRING = 1, /* Set parameter, supplying a string value */
| ^~~~~~~~~~~~~~~~~~~
/usr/include/sys/mount.h:246:3: error: redeclaration of enumerator 'FSCONFIG_SET_BINARY'
246 | FSCONFIG_SET_BINARY = 2, /* Set parameter, supplying a binary blob value */
| ^~~~~~~~~~~~~~~~~~~
criu/include/linux/mount.h:16:9: note: previous definition of 'FSCONFIG_SET_BINARY' with type 'enum fsconfig_command'
16 | FSCONFIG_SET_BINARY = 2, /* Set parameter, supplying a binary blob value */
| ^~~~~~~~~~~~~~~~~~~
/usr/include/sys/mount.h:248:3: error: redeclaration of enumerator 'FSCONFIG_SET_PATH'
248 | FSCONFIG_SET_PATH = 3, /* Set parameter, supplying an object by path */
| ^~~~~~~~~~~~~~~~~
criu/include/linux/mount.h:18:9: note: previous definition of 'FSCONFIG_SET_PATH' with type 'enum fsconfig_command'
18 | FSCONFIG_SET_PATH = 3, /* Set parameter, supplying an object by path */
| ^~~~~~~~~~~~~~~~~
/usr/include/sys/mount.h:250:3: error: redeclaration of enumerator 'FSCONFIG_SET_PATH_EMPTY'
250 | FSCONFIG_SET_PATH_EMPTY = 4, /* Set parameter, supplying an object by (empty) path */
| ^~~~~~~~~~~~~~~~~~~~~~~
criu/include/linux/mount.h:20:9: note: previous definition of 'FSCONFIG_SET_PATH_EMPTY' with type 'enum fsconfig_command'
20 | FSCONFIG_SET_PATH_EMPTY = 4, /* Set parameter, supplying an object by (empty) path */
| ^~~~~~~~~~~~~~~~~~~~~~~
/usr/include/sys/mount.h:252:3: error: redeclaration of enumerator 'FSCONFIG_SET_FD'
252 | FSCONFIG_SET_FD = 5, /* Set parameter, supplying an object by fd */
| ^~~~~~~~~~~~~~~
criu/include/linux/mount.h:22:9: note: previous definition of 'FSCONFIG_SET_FD' with type 'enum fsconfig_command'
22 | FSCONFIG_SET_FD = 5, /* Set parameter, supplying an object by fd */
| ^~~~~~~~~~~~~~~
/usr/include/sys/mount.h:254:3: error: redeclaration of enumerator 'FSCONFIG_CMD_CREATE'
254 | FSCONFIG_CMD_CREATE = 6, /* Invoke superblock creation */
| ^~~~~~~~~~~~~~~~~~~
criu/include/linux/mount.h:24:9: note: previous definition of 'FSCONFIG_CMD_CREATE' with type 'enum fsconfig_command'
24 | FSCONFIG_CMD_CREATE = 6, /* Invoke superblock creation */
| ^~~~~~~~~~~~~~~~~~~
/usr/include/sys/mount.h:256:3: error: redeclaration of enumerator 'FSCONFIG_CMD_RECONFIGURE'
256 | FSCONFIG_CMD_RECONFIGURE = 7, /* Invoke superblock reconfiguration */
| ^~~~~~~~~~~~~~~~~~~~~~~~
criu/include/linux/mount.h:26:9: note: previous definition of 'FSCONFIG_CMD_RECONFIGURE' with type 'enum fsconfig_command'
26 | FSCONFIG_CMD_RECONFIGURE = 7, /* Invoke superblock reconfiguration */
This patch adds definition for FSOPEN_CLOEXEC to solve this problem. In particular,
sys/mount.h includes ifndef check for FSOPEN_CLOEXEC surrounding `enum fsconfig_command`.
[1] https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=7eae6a91e9b1670330c9f15730082c91c0b1d570
Reported-by: Younes Manton (@ymanton)
Signed-off-by: Radostin Stoyanov <rstoyanov@fedoraproject.org>
diff --git a/criu/include/linux/mount.h b/criu/include/linux/mount.h
index 0d55a588cb9a87fa..fefafa89e14ddab2 100644
--- a/criu/include/linux/mount.h
+++ b/criu/include/linux/mount.h
@@ -6,7 +6,7 @@
/* Copied from /usr/include/sys/mount.h */
-#ifndef FSCONFIG_CMD_CREATE
+#ifndef FSOPEN_CLOEXEC
/* The type of fsconfig call made. */
enum fsconfig_command {
FSCONFIG_SET_FLAG = 0, /* Set parameter, supplying no value */
@@ -26,7 +26,13 @@ enum fsconfig_command {
FSCONFIG_CMD_RECONFIGURE = 7, /* Invoke superblock reconfiguration */
#define FSCONFIG_CMD_RECONFIGURE FSCONFIG_CMD_RECONFIGURE
};
-#endif // FSCONFIG_CMD_CREATE
+
+#endif // FSOPEN_CLOEXEC
+
+/* fsopen flags. With the redundant definition, we check if the kernel,
+ * glibc value and our value still match.
+ */
+#define FSOPEN_CLOEXEC 0x00000001
#ifndef MS_MGC_VAL
/* Magic mount flag number. Has to be or-ed to the flag values. */

View File

@ -17,7 +17,7 @@
Name: criu
Version: 3.17.1
Release: 3%{?dist}
Release: 4%{?dist}
Summary: Tool for Checkpoint/Restore in User-space
License: GPLv2
URL: http://criu.org/
@ -27,6 +27,9 @@ Source0: https://github.com/checkpoint-restore/criu/archive/v%{version}/criu-%{v
# We use this patch because the protobuf-c package name
# in RPM and DEB is different.
Patch99: criu.pc.patch
Patch100: criu-glibc-2.36-1.patch
Patch101: criu-glibc-2.36-2.patch
Patch102: criu-glibc-2.36-3.patch
%if 0%{?rhel} && 0%{?rhel} <= 7
BuildRequires: perl
@ -38,7 +41,7 @@ Source3: criu-ns.1
# The patch aio-fix.patch is needed as RHEL7
# doesn't do "nr_events *= 2" in ioctx_alloc().
Patch100: aio-fix.patch
Patch199: aio-fix.patch
%endif
Source5: criu-tmpfiles.conf
@ -123,9 +126,12 @@ This script can help to workaround the so called "PID mismatch" problem.
%setup -q
%patch99 -p1
%patch100 -p1
%patch101 -p1
%patch102 -p1
%if 0%{?rhel} && 0%{?rhel} <= 7
%patch100 -p1
%patch199 -p1
%endif
%build
@ -210,6 +216,9 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/libcriu.a
%doc %{_mandir}/man1/criu-ns.1*
%changelog
* Fri Dec 2 2022 Florian Weimer <fweimer@redhat.com> - 3.17.1-4
- Fix FTBFS with glibc 2.36
* Wed Jul 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 3.17.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild