[CRIU] [PATCH] zdtm: use pthread_create to create a thread
Tycho Andersen
tycho.andersen at canonical.com
Wed Sep 9 09:17:20 PDT 2015
On Wed, Sep 09, 2015 at 07:10:41PM +0300, Andrew Vagin wrote:
> If you call clone directly you are responsible for setting up the TLS area yourself.
Whoops, and the test framework uses this of course; sorry about that.
Thanks,
Acked-by: Tycho Andersen <tycho.andersen at canonical.com>
> $ abrt-cli ls | grep different_creds | wc -l
> 39
> $ gdb -c /var/spool/abrt/ccpp-2015-07-24-10\:21\:14-8014/coredump different_creds
> Core was generated by `./different_creds --pidfile=different_creds.pid --outfile=different_creds.out'.
> Program terminated with signal SIGILL, Illegal instruction.
> #0 0x00007f86e2d8c7d9 in _dl_x86_64_restore_sse () from /lib64/ld-linux-x86-64.so.2
> Missing separate debuginfos, use: dnf debuginfo-install glibc-2.21-7.fc22.x86_64 libattr-2.4.47-9.fc22.x86_64 libcap-2.24-7.fc22.x86_64
> (gdb) bt
> #0 0x00007f86e2d8c7d9 in _dl_x86_64_restore_sse () from /lib64/ld-linux-x86-64.so.2
> #1 0x00007f86e2d84add in _dl_fixup () from /lib64/ld-linux-x86-64.so.2
> #2 0x00007f86e2d8bbc0 in _dl_runtime_resolve () from /lib64/ld-linux-x86-64.so.2
> #3 0x0000000000402da3 in sys_futex (val3=0, uaddr2=0x0, timeout=0x0, val=0, op=0, uaddr=0x6063f0 <sig_received>) at lock.h:29
> #4 futex_wait_while (f=0x6063f0 <sig_received>, v=0) at lock.h:121
> #5 test_waitsig () at test.c:367
> #6 0x0000000000401c4b in main (argc=<optimized out>, argv=0x7ffce16432f8) at different_creds.c:82
>
> Reported-by: Mr Jenkins
> Cc: Tycho Andersen <tycho.andersen at canonical.com>
> Signed-off-by: Andrew Vagin <avagin at openvz.org>
> ---
> test/zdtm/live/static/Makefile | 1 +
> test/zdtm/live/static/different_creds.c | 26 ++++++++++++--------------
> 2 files changed, 13 insertions(+), 14 deletions(-)
>
> diff --git a/test/zdtm/live/static/Makefile b/test/zdtm/live/static/Makefile
> index 67be675..e66d3ca 100644
> --- a/test/zdtm/live/static/Makefile
> +++ b/test/zdtm/live/static/Makefile
> @@ -317,6 +317,7 @@ inotify_system_nodel: override CFLAGS += -DNODEL
> pthread00: override LDLIBS += -pthread
> pthread01: override LDLIBS += -pthread
> pthread02: override LDLIBS += -pthread
> +different_creds: override LDLIBS += -pthread
> sigpending: override LDLIBS += -pthread
> sigaltstack: override LDLIBS += -pthread
> shm: override CFLAGS += -DNEW_IPC_NS
> diff --git a/test/zdtm/live/static/different_creds.c b/test/zdtm/live/static/different_creds.c
> index 545dcb3..c9d23c9 100644
> --- a/test/zdtm/live/static/different_creds.c
> +++ b/test/zdtm/live/static/different_creds.c
> @@ -6,13 +6,18 @@
> #include <sched.h>
> #include <sys/capability.h>
> #include <linux/limits.h>
> +#include <pthread.h>
> +#include <syscall.h>
>
> #include "zdtmtst.h"
>
> const char *test_doc = "Check that threads with different creds aren't checkpointed";
> const char *test_author = "Tycho Andersen <tycho.andersen at canonical.com>";
>
> -int drop_caps_and_wait(void *arg)
> +#define exit_group(code) \
> + syscall(__NR_exit_group, code)
> +
> +void *drop_caps_and_wait(void *arg)
> {
> cap_t caps;
> int *pipe = arg;
> @@ -20,7 +25,7 @@ int drop_caps_and_wait(void *arg)
> caps = cap_get_proc();
> if (!caps) {
> err("cap_get_proc");
> - return 1;
> + return NULL;
> }
>
> if (cap_clear_flag(caps, CAP_EFFECTIVE) < 0) {
> @@ -39,18 +44,14 @@ int drop_caps_and_wait(void *arg)
> sleep(1000);
> die:
> cap_free(caps);
> - return 1;
> + return NULL;
> }
>
> int main(int argc, char ** argv)
> {
> - pid_t pid;
> int ret, pipefd[2];
> - long clone_flags = CLONE_VM | CLONE_FILES | CLONE_SIGHAND |
> - CLONE_THREAD | CLONE_SYSVSEM;
> + pthread_t thr;
>
> - size_t stack_size = sysconf(_SC_PAGESIZE);
> - void *stack = alloca(stack_size);
> char buf;
>
> test_init(argc, argv);
> @@ -60,12 +61,10 @@ int main(int argc, char ** argv)
> return -1;
> }
>
> - pid = clone(drop_caps_and_wait, stack + stack_size, clone_flags, pipefd);
> - if (pid < 0) {
> - err("fork");
> + if (pthread_create(&thr, NULL, drop_caps_and_wait, pipefd)) {
> + err("Unable to create thread");
> return -1;
> }
> -
> close(pipefd[1]);
>
> /*
> @@ -83,6 +82,5 @@ int main(int argc, char ** argv)
>
> fail("shouldn't dump successfully");
>
> - kill(pid, SIGKILL);
> - return ret;
> + exit_group(ret);
> }
> --
> 2.4.3
>
More information about the CRIU
mailing list