Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/checkpoint-restore/criu.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/compel
AgeCommit message (Collapse)Author
2022-10-02compel: Fix ppc64le parasite stack layoutYounes Manton
The ppc64le ABI allows functions to store data in caller frames. When initializing the stack pointer prior to executing parasite code we need to pre-allocating the minimum sized stack frame before jumping to the parasite code. Signed-off-by: Younes Manton <ymanton@ca.ibm.com>
2022-10-02compel: Add test to check parasite stack setupYounes Manton
Some ABIs allow functions to store data in caller frame, which means that we have to allocate an initial stack frame before executing code on the parasite stack. This test saves the contents of writable memory that follows the stack after the victim has been infected but before we start using the parasite stack. It later checks that the saved data matches the current contents of the two memory areas. This is done while the victim is halted so we expect a match unless executing parasite code caused memory corruption. The test doesn't detect cases where we corrupted memory by writing the same value. Signed-off-by: Younes Manton <ymanton@ca.ibm.com>
2022-10-02compel: Fix infect test to not override failuresYounes Manton
Signed-off-by: Younes Manton <ymanton@ca.ibm.com> return zero on chk success Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com> Co-authored-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
2022-10-02compel: Add APIs to facilitate testingYounes Manton
Starting the daemon is the first time we run code in the victim using the parasite stack. It's useful for testing to be able to infect the victim without starting the daemon so that we can inspect the victim's state, set up stack guards, and so on before stack-related corruption can happen. Add compel_infect_no_daemon() to infect the victim but not start the daemon and compel_start_daemon() to start the daemon after the victim is infected. Add compel_get_stack() to get the victim's main and thread parasite stacks. Signed-off-by: Younes Manton <ymanton@ca.ibm.com>
2022-08-15breakpoint: enable breakpoints by default on amd64 and arm64fu.lin
Signed-off-by: fu.lin <fulin10@huawei.com> Signed-off-by: Andrei Vagin <avagin@gmail.com>
2022-08-15breakpoint: implement hw breakpoint for arm64 platformfu.lin
The x86 implement hardware breakpoint to accelerate the tracing syscall procedure instead of `ptrace(PTRACE_SYSCALL)`. The arm64 has the same capability according to <<Learn the architecture: Armv8-A self-hosted debug>>[[1]]. <<Arm Architecture Reference Manual for A-profile architecture>[[2]] illustrates the usage detailly: - D2.8 Breakpoint Instruction exceptions - D2.9 Breakpoint exceptions - D13.3.2 DBGBCR<n>_EL1, Debug Breakpoint Control Registers, n Note: [1]: https://developer.arm.com/documentation/102120/0100 [2]: https://developer.arm.com/documentation/ddi0487/latest Signed-off-by: fu.lin <fulin10@huawei.com> Signed-off-by: Andrei Vagin <avagin@gmail.com>
2022-08-15compel: switch breakpoint functions to non-inline at arm64 platformfu.lin
Signed-off-by: fu.lin <fulin10@huawei.com> Signed-off-by: Andrei Vagin <avagin@gmail.com>
2022-08-15compel: clear a breakpoint right after it's been triggeredAndrei Vagin
Breakpoints are used to stop as close as possible to a target system call. First, we don't need it after this point. Second, PTRACE_CONT can't pass through a breakpoint on arm64. Signed-off-by: Andrei Vagin <avagin@gmail.com>
2022-08-15compel: set TRACESYSGOOD to distinguish breakpoints from syscallsAndrei Vagin
When delivering system call traps, set bit 7 in the signal number (i.e., deliver SIGTRAP|0x80). This makes it easy for the tracer to distinguish normal traps from those caused by a system call. Signed-off-by: Andrei Vagin <avagin@gmail.com>
2022-07-19x86/compel/fault-inject: fixup mxcsr for PTRACE_SETFPREGSAlexander Mikhalitsyn
Error from: ./test/zdtm.py run -t zdtm/static/fpu00 --fault 134 -f h --norst (00.003111) Dumping GP/FPU registers for 56 (00.003121) Error (compel/arch/x86/src/lib/infect.c:310): Corrupting fpuregs for 56, seed 1651766595 (00.003125) Error (compel/arch/x86/src/lib/infect.c:314): Can't set FPU registers for 56: Invalid argument (00.003129) Error (compel/src/lib/infect.c:688): Can't obtain regs for thread 56 (00.003174) Error (criu/cr-dump.c:1564): Can't infect (pid: 56) with parasite See also: 145e9e0d8c6 ("x86/fpu: Fail ptrace() requests that try to set invalid MXCSR values") https://github.com/torvalds/linux/commit/145e9e0d8c6fada4a40f9fc65b34658077874d9c We decided to move from mxcsr cleaning up scheme and use mxcsr mask (0x0000ffbf) as kernel does. Thanks to Dmitry Safonov for pointing out. Tested-on: Intel(R) Xeon(R) CPU E3-1246 v3 @ 3.50GHz Reported-by: Mr. Jenkins Suggested-by: Dmitry Safonov <dima@arista.com> Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
2022-07-02infect: add SIGTSTP supportYuriy Vasiliev
Add SIGTSTP signal dump and restore. Add a corresponding field in the image, save it only if a task is in the stopped state. Restore task state by sending desired stop signal if it is present in the image. Fallback to SIGSTOP if it's absent. Signed-off-by: Yuriy Vasiliev <yuriy.vasiliev@openvz.org>
2022-04-29compel: add helpers to get/set instruction pointerAlexander Mikhalitsyn
Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
2022-04-29cr-check: Add ptrace rseq conf dump featureAlexander Mikhalitsyn
Add "get_rseq_conf" feature corresponding to the ptrace(PTRACE_GET_RSEQ_CONFIGURATION) support. Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
2022-04-29compel: add rseq syscall into compel std plugin syscall tablesAlexander Mikhalitsyn
Add rseq syscall numbers for: arm/aarch64, mips64, ppc64le, s390, x86_64/x86 Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
2022-04-29Fix remaining codespell warningsKir Kolyshkin
Those that codespell have a few variants for: ./soccr/soccr.c:219: thise ==> these, this ./soccr/soccr.c:444: sence ==> sense, since ./criu/net.c:665: ot ==> to, of, or ./criu/net.c:775: ot ==> to, of, or ./criu/files.c:1244: wan't ==> want, wasn't ./criu/kerndat.c:1141: happend ==> happened, happens, happen ./criu/mount-v2.c:781: carefull ==> careful, carefully ./test/zdtm/static/socket_aio.c:54: Chiled ==> Child, chilled ./test/zdtm/static/socket_listen6.c:73: Chiled ==> Child, chilled ./test/zdtm/static/socket_listen.c:73: Chiled ==> Child, chilled ./test/zdtm/static/socket_listen4v6.c:73: Chiled ==> Child, chilled ./test/zdtm/static/sk-unix-dgram-ghost.c:201: childs ==> children, child's ./test/zdtm/static/sk-unix-dgram-ghost.c:205: childs ==> children, child's ./compel/arch/x86/src/lib/infect.c:297: automatical ==> automatically, automatic, automated While at it, do some other minor fixes in the same lines. Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2022-04-29Fix some codespell warningsKir Kolyshkin
Brought to you by codespell -w (using codespell v2.1.0). Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2022-04-29Rename useable to usableKir Kolyshkin
I am not sure if this is going to bring any compatibility issues. If yes, we need to remove this patch and add "useable" to the list of ignored words instead. Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2022-04-29criu: generate unique socket namesAndrei Vagin
CRIU has a few places where it creates unix sockets and their names have to be unique for each criu run. Fixes: #1798 Signed-off-by: Andrei Vagin <avagin@google.com>
2022-04-29style: delete some redundant codejiang wei
There is some redundant in compel/src/main.c, making it better Signed-off-by: jiang wei <jwcesign@gmail.com>
2022-04-29kerndat: check whether the openat2 syscall is supportedPavel Tikhomirov
Will use openat2 + RESOLVE_NO_XDEV to detect mountpoints. Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
2022-04-29compel: add open_tree syscallPavel Tikhomirov
Will use this for cross mount namespace bindmounts. Note: don't need separate kdat for mount-v2, as MOVE_MOUNT_SET_GROUP were added much later than open_tree and all related fixups. Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
2022-04-29kerndat: Check for MOVE_MOUNT_SET_GROUP availabilityPavel Tikhomirov
Mounts-v2 requires new kernel feature MOVE_MOUNT_SET_GROUP to be able to restore propagation between mounts right. Cherry-picked from Virtuozzo criu: https://src.openvz.org/projects/OVZ/repos/criu/commits/7da7f9a17 Changes: define move_mount syscall, check mainstream kernel MOVE_MOUNT_SET_GROUP feature, use our "linux/mount.h" to overcome possible problems of non-existing header on older kernels. v3: coverity CID 389201: check ret of umount2 and rmdir at cleanup stage Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
2022-04-29compel: set mxcsr during error injection to zeroAdrian Reber
During error injection tests there are random values loaded in some of the registers. The kernel, however, has the following check: if (mxcsr[0] & ~mxcsr_feature_mask) return -EINVAL; So depending on the random values loaded mxcsr might have values that the kernel rejects with EINVAL. Setting mxcsr to zero during the tests lets the error injection test pass. Signed-off-by: Adrian Reber <areber@redhat.com>
2022-04-29compel: fix how PTRACE_GET_THREAD_AREA errors are handledMike Rapoport
When PTRACE_GET_THREAD_AREA errors on kernels with !CONFIG_IA32_EMULATION beacuse of missing support (-EIO), compel should ignore uch errors in native mode. However the check for error type uses return value of ptrace rather than errno, which will always result in error propagation. Use errno to detect type of error to fix this. Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
2022-04-29compel: fix parasite with GCC 12Adrian Reber
Parasite creation started to fail with GCC 12: On x86_64 with: ./compel/compel-host hgen -f criu/pie/restorer.built-in.o -o criu/pie/restorer-blob.h Error (compel/src/lib/handle-elf-host.c:337): Unexpected undefined symbol: `strlen'. External symbol in PIE? On aarch64 with: ld: criu/pie/restorer.o: in function `lsm_set_label': /drone/src/criu/pie/restorer.c:174: undefined reference to `strlen' Line 174 is: "for (len = 0; label[len]; len++)" Adding '-ffreestanding' to parasite compilation fixes these errors because, according to GCC developers: "strlen is a standard C function, so I don't see any bug in that being used unless you do a freestanding compilation (-nostdlib isn't that)." Signed-off-by: Adrian Reber <areber@redhat.com>
2022-04-29compel: fix GCC 12 failure (out of bounds)Adrian Reber
This is a confusing change as it seems the original code was just wrong. GCC 12 complains with: In function ‘__conv_val’, inlined from ‘std_strtoul’ at compel/plugins/std/string.c:202:7: compel/plugins/std/string.c:154:24: error: array subscript 97 is above array bounds of ‘const char[37]’ [-Werror=array-bounds] 154 | return &conv_tab[__tolower(c)] - conv_tab; | ^~~~~~~~~~~~~~~~~~~~~~~ compel/plugins/std/string.c: In function ‘std_strtoul’: compel/plugins/std/string.c:10:19: note: while referencing ‘conv_tab’ 10 | static const char conv_tab[] = "0123456789abcdefghijklmnopqrstuvwxyz"; | ^~~~~~~~ cc1: all warnings being treated as errors Which sounds correct. The array conv_tab has just 37 elements. If I understand the code correctly we are trying to convert anything that is character between a-z and A-Z to a number for cases where the base is larger than 10. For a base 11 conversion b|B should return 11. For a base 35 conversion z|Z should return 35. This is all for a strtoul() implementation. The original code was: static const char conv_tab[] = "0123456789abcdefghijklmnopqrstuvwxyz"; return &conv_tab[__tolower(c)] - conv_tab; and that seems wrong. If conv_tab would have been some kind of hash it could have worked, but '__tolower()' will always return something larger than 97 ('a') which will always overflow the array. But maybe I just don't get that part of the code. I replaced it with return __tolower(c) - 'a' + 10; which does the right thing: 'A' = 10, 'B' = 11 ... 'Z' = 35 Signed-off-by: Adrian Reber <areber@redhat.com>
2022-04-29x86/compel/fault-inject: print the initial seedAlexander Mikhalitsyn
Fixes: e2e8be37 ("x86/compel/fault-inject: Add a fault-injection for corrupting extended regset") Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
2022-04-29x86/compel/fault-inject: bound xsave features setAlexander Mikhalitsyn
Since e2e8be37 ("x86/compel/fault-inject: Add a fault-injection for corrupting extended regset") we doing fault-injection test for C/R of threads register set by filling tasks xsave structures with the garbage. But there are some features for which that's not safe. It leads to failures like described in #1635 In this particular case we meet the problem with PKRU feature, the problem that after corrupting pkru registers we may restrict access to some vma areas, so, after that process with the parasite injected get's segfault and crashes. Let's manually specify which features is save to fill with the garbage by keeping proper XFEATURE_MASK_FAULTINJ mask value. Fixes: e2e8be37 ("x86/compel/fault-inject: Add a fault-injection for corrupting extended regset") https://github.com/checkpoint-restore/criu/issues/1635 Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
2022-04-29clang-format: do automatic comment fixupsPavel Tikhomirov
Result of `make indent` after enabling AlignTrailingComments. Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
2021-09-03Run 'make indent' on header filesAdrian Reber
Acked-by: Mike Rapoport <rppt@linux.ibm.com> Signed-off-by: Adrian Reber <areber@redhat.com>
2021-09-03Run 'make indent' on all C filesAdrian Reber
Acked-by: Mike Rapoport <rppt@linux.ibm.com> Signed-off-by: Adrian Reber <areber@redhat.com>
2021-09-03proc_parse: get a thread ID in a thread pidns from /proc/pid/statusAndrei Vagin
Signed-off-by: Andrei Vagin <avagin@gmail.com>
2021-09-03ci: fix mips64el-cross testAdrian Reber
The mips64el-cross test target started to show following error: error: listing the stack pointer register '$29' in a clobber list is deprecated [-Werror=deprecated] This fixes it in three different places by removing $29' from the clobber list. This is only compile tested as we have no mips hardware for testing. Signed-off-by: Adrian Reber <areber@redhat.com>
2021-09-03ksigset: fix a typo in ksigdelsetAndrei Vagin
Fixes: 8063eb8fe641 ("parasite: don't block SIGTRAP") Reported-by: zl-wang <zlwang@ca.ibm.com> Signed-off-by: Andrei Vagin <avagin@gmail.com>
2021-09-03criu: check if pidfd_getfd syscall is supportedZeyad Yasser
pidfd_getfd syscall will be needed later to send pidfds between pre-dump/dump iterations for pid reuse detection. v2: - check size written/read of val_a/val_b is correct - return with error when val_a != val_b Signed-off-by: Zeyad Yasser <zeyady98@gmail.com>
2021-09-03criu: check if pidfd_open syscall is supportedZeyad Yasser
pidfd_open syscall will be needed later to send pidfds between pre-dump/dump iterations for pid reuse detection. v2: - make kerndat_has_pidfd_open void since 0 is always returned - fix missing tabs in syscall tables Signed-off-by: Zeyad Yasser <zeyady98@gmail.com>
2021-09-03parasite: don't block SIGTRAPAndrei Vagin
This is the workaround for #1429. The parasite code contains instructions that trigger SIGTRAP to stop at certain points. In such cases, the kernel sends a force SIGTRAP that can't be ignore and if it is blocked, the kernel resets its signal handler to a default one and unblocks it. It means that if we want to save the origin signal handle Signed-off-by: Andrei Vagin <avagin@gmail.com>
2021-09-03mips: remove empty gitignoreRadostin Stoyanov
Signed-off-by: Radostin Stoyanov <rstoyanov@fedoraproject.org>
2021-09-03mips: coding style fixesRadostin Stoyanov
CRIU follows Linux kernel coding style. This patch updates the architecture-specific code for MIPS to use tab indentation, add whitespace between closing parenthesis and open bracket, and changes the mode of source files from 755 to 644. Signed-off-by: Radostin Stoyanov <rstoyanov@fedoraproject.org>
2021-09-03Whitespace at EOL cleanup and checkKir Kolyshkin
My editor (vim) auto-removes whitespace at EOL for *.c and *.h files, and I think it makes sense to have a separate commit for this, rather than littering other commits with such changes. To make sure this won't pile up again, add a line to Makefile under the linter target to check for such things (so CI will fail). This is all whitespace except an addition to Makefile. Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-09-03Drop \n from pr_perrorKir Kolyshkin
Another pr_perror spring cleaning time! As pr_perror adds a semicolon, an strerror(errno), and a newline, there's no need to add one manually. Brought to you by for f in $(git grep -l pr_perror); do test -f $f || continue echo $f sed -i '\%^[[:space:]]*pr_perror(.*\\n"%s/\\n//' $f done Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
2021-09-03Revert "compel: add -ffreestanding to force gcc not to use builtin memcpy, ↵Dmitry Safonov
memset" This reverts commit c98af78c58e2168d2322cd0ee15837468fd4ffb0. Now FPU/SSE/MMX/etc can be used inside parasite. Let's have compiler optimizations back. Cc: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com> Signed-off-by: Dmitry Safonov <dima@arista.com>
2021-09-03s390: Purge stale commentDmitry Safonov
Signed-off-by: Dmitry Safonov <dima@arista.com>
2021-09-03compel: Provide compel_set_task_ext_regs()Dmitry Safonov
Arch-dependend way to restore extended registers set. Use it straight-away to restore per-thread registers. Signed-off-by: Dmitry Safonov <dima@arista.com>
2021-09-03compel: Store extended registers set in the thread contextDmitry Safonov
Extended registers set for task is restored with rt_sigreturn() through prepared sigframe. For threads it's currently lost. Preserve it inside thread context to restore on thread curing. Signed-off-by: Dmitry Safonov <dima@arista.com>
2021-09-03x86/compel/fault-inject: Add a fault-injection for corrupting extended regsetDmitry Safonov
With pseudo-random garbage, the seed is printed with pr_err(). get_task_regs() is called during seizing the task and also for each thread. At this moment only for x86. Signed-off-by: Dmitry Safonov <dima@arista.com>
2021-09-03x86: Use PTRACE_GET_THREAD_AREA instead of sys_get_thread_area()Dmitry Safonov
To minimize things done in parasite, PTRACE_GET_THREAD_AREA can be used to get remote tls. That also removes an additional compat stack (de)allocation in the parasite (also asm-coded syscall). In order to use PTRACE_GET_THREAD_AREA, the dumpee should be stopped. So, let's move this from criu to compel to non-seized state and put tls into thread info on x86. Signed-off-by: Dmitry Safonov <dima@arista.com>
2021-09-03compel/test: Fix warn_unused_resultRadostin Stoyanov
gcc -O2 -g -Wall -Werror -I ../../../compel/include/uapi -o spy spy.c ../../../compel/libcompel.a spy.c: In function ‘check_pipe_ends’: spy.c:107:2: error: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Werror=unused-result] 107 | write(wfd, "1", 2); | ^~~~~~~~~~~~~~~~~~ spy.c:108:2: error: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Werror=unused-result] 108 | read(rfd, aux, sizeof(aux)); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ cc1: all warnings being treated as errors Signed-off-by: Radostin Stoyanov <rstoyanov@fedoraproject.org>
2021-09-03compel: Fix missing loff_t in AlpineRadostin Stoyanov
musl defines 'loff_t' in fcntl.h as 'off_t'. This patch resolves the following error when running the compel tests on Alpine Linux: gcc -O2 -g -Wall -Werror -c -Wstrict-prototypes -fno-stack-protector -nostdlib -fomit-frame-pointer -ffreestanding -fpie -I ../../../compel/include/uapi -o parasite.o parasite.c In file included from ../../../compel/include/uapi/compel/plugins/std/syscall.h:8, from ../../../compel/include/uapi/compel/plugins/std.h:5, from parasite.c:3: ../../../compel/include/uapi/compel/plugins/std/syscall-64.h:19:66: error: unknown type name 'loff_t'; did you mean 'off_t'? 19 | extern long sys_pread (unsigned int fd, char *buf, size_t count, loff_t pos) ; | ^~~~~~ | off_t ../../../compel/include/uapi/compel/plugins/std/syscall-64.h:96:46: error: unknown type name 'loff_t'; did you mean 'off_t'? 96 | extern long sys_fallocate (int fd, int mode, loff_t offset, loff_t len) ; | ^~~~~~ | off_t ../../../compel/include/uapi/compel/plugins/std/syscall-64.h:96:61: error: unknown type name 'loff_t'; did you mean 'off_t'? 96 | extern long sys_fallocate (int fd, int mode, loff_t offset, loff_t len) ; | ^~~~~~ | off_t make[1]: *** [Makefile:32: parasite.o] Error 1 Signed-off-by: Radostin Stoyanov <rstoyanov@fedoraproject.org>
2021-09-03compel/test: Add main makefileRadostin Stoyanov
These changes enable running all compel tests with a single command from the root path of the repository: # sudo make -C compel/test Signed-off-by: Radostin Stoyanov <rstoyanov@fedoraproject.org>