From 2a16ebb074de725a806bb51afed90584a0c3dadb Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Fri, 2 Dec 2022 07:57:27 +0100 Subject: [PATCH] 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: --- criu-glibc-2.36-1.patch | 206 +++++++++++++++++++++++++++++++ criu-glibc-2.36-2.patch | 264 ++++++++++++++++++++++++++++++++++++++++ criu-glibc-2.36-3.patch | 101 +++++++++++++++ criu.spec | 15 ++- 4 files changed, 583 insertions(+), 3 deletions(-) create mode 100644 criu-glibc-2.36-1.patch create mode 100644 criu-glibc-2.36-2.patch create mode 100644 criu-glibc-2.36-3.patch diff --git a/criu-glibc-2.36-1.patch b/criu-glibc-2.36-1.patch new file mode 100644 index 0000000..a56d5e5 --- /dev/null +++ b/criu-glibc-2.36-1.patch @@ -0,0 +1,206 @@ +commit 1e6e826ffb7ac05f33fa123051c2fc2ddf0f68ea +Author: Alexander Mikhalitsyn +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 + +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 ++#include ++ ++#include "common/config.h" ++ ++#ifdef CONFIG_HAS_NO_LIBC_RSEQ_DEFS + /* + * linux/rseq.h + * +@@ -18,9 +23,6 @@ + * Copyright (c) 2015-2018 Mathieu Desnoyers + */ + +-#include +-#include +- + 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 ++#endif ++#endif ++ ++enum rseq_cpu_id_state { ++ RSEQ_CPU_ID_UNINITIALIZED = -1, ++ RSEQ_CPU_ID_REGISTRATION_FAILED = -2, ++}; ++ ++int main(void) ++{ ++ return 0; ++} ++endef diff --git a/criu-glibc-2.36-2.patch b/criu-glibc-2.36-2.patch new file mode 100644 index 0000000..9edc45d --- /dev/null +++ b/criu-glibc-2.36-2.patch @@ -0,0 +1,264 @@ +commit 4c86d6a7d54abb64fc5a15131f3351224e8c071b +Author: Radostin Stoyanov +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 `` 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 + ``. The include for `` has been replaced + with local include to avoid conflicts with ``. + + Fixes: #1949 + + Signed-off-by: Radostin Stoyanov + +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 + #include + #include +-#include + + #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 + #include "common/compiler.h" + +-#include "linux/mount.h" + #include "linux/rseq.h" + + #include "clone-noasan.h" +@@ -86,6 +85,8 @@ + #include + #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 ++#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 +-#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 + #include + #include +-#include + #include + #include + #include +@@ -14,6 +13,7 @@ + #include "int.h" + #include "types.h" + #include ++#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 +- +-int main(void) +-{ +- if (FSCONFIG_CMD_CREATE > 0) +- return 0; +- return 0; +-} +- +-endef +- + define FEATURE_TEST_NFTABLES_LIB_API_0 + + #include diff --git a/criu-glibc-2.36-3.patch b/criu-glibc-2.36-3.patch new file mode 100644 index 0000000..278f38d --- /dev/null +++ b/criu-glibc-2.36-3.patch @@ -0,0 +1,101 @@ +commit 517c0947050e63aac72f63a3bf373d76264723b9 +Author: Radostin Stoyanov +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 + +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. */ diff --git a/criu.spec b/criu.spec index c49dd3a..9dc3977 100644 --- a/criu.spec +++ b/criu.spec @@ -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 - 3.17.1-4 +- Fix FTBFS with glibc 2.36 + * Wed Jul 20 2022 Fedora Release Engineering - 3.17.1-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild