[CRIU] Re: [PATCH] zdtm: check a control terminal can be restored
without a proper session leader
Andrey Wagin
avagin at gmail.com
Mon Oct 29 11:06:56 EDT 2012
This test case can be executed only in pidns, because a child is
re-parented to init...
# bash test/zdtm.sh ns/static/tty01
./tty01 --pidfile=tty01.pid --outfile=tty01.out
make: Leaving directory
`/root/crtools/test/dump/crtools-root.DtzX4E/zdtm/live/static'
PID TTY TIME CMD
7444 ? 00:00:00 tty01
Dump 7444
test/zdtm.sh: line 238: 7458 Hangup setsid $CRTOOLS
dump --tcp-established --link-remap -x --evasive-devices -D $ddump -o
dump.log -v 4 -t $PID $args $ARGS
WARNING: process tty01 is left running for your debugging needs
Test: zdtm/live/static/tty01
====================== ERROR ======================
Dump log : /root/crtools/test/dump/tty01/7444/1/dump.log
2012/10/29 Andrey Vagin <avagin at openvz.org>:
> ---
> sk-unix.c | 7 --
> test/zdtm.sh | 4 ++
> test/zdtm/live/static/Makefile | 1 +
> test/zdtm/live/static/mountpoints.c | 2 +-
> test/zdtm/live/static/tty01.c | 127 ++++++++++++++++++++++++++++++++++++
> 5 files changed, 133 insertions(+), 8 deletions(-)
> create mode 100644 test/zdtm/live/static/tty01.c
>
> diff --git a/sk-unix.c b/sk-unix.c
> index 8da7ac4..bf2d133 100644
> --- a/sk-unix.c
> +++ b/sk-unix.c
> @@ -92,15 +92,8 @@ static int can_dump_unix_sk(const struct unix_sk_desc *sk)
>
> switch (sk->state) {
> case TCP_LISTEN:
> - break;
> case TCP_ESTABLISHED:
> - break;
> case TCP_CLOSE:
> - if (sk->type != SOCK_DGRAM) {
> - pr_err("Unexpected state %d on type %d\n",
> - sk->state, sk->type);
> - return 0;
> - }
> break;
> default:
> pr_err("Unknown state %d\n", sk->state);
> diff --git a/test/zdtm.sh b/test/zdtm.sh
> index fbc009c..e1a0755 100644
> --- a/test/zdtm.sh
> +++ b/test/zdtm.sh
> @@ -243,6 +243,8 @@ EOF
> mkdir -p $ddump
>
> save_fds $PID $ddump/dump.fd
> + ps axf > $ddump/ps.before
> +read
> setsid $CRTOOLS dump --tcp-established --link-remap -x --evasive-devices -D $ddump -o dump.log -v 4 -t $PID $args $ARGS || {
> echo WARNING: process $tname is left running for your debugging needs
> return 1
> @@ -269,6 +271,8 @@ EOF
> echo Restore $PID
> setsid $CRTOOLS restore --tcp-established -x -D $ddump -o restore.log -v 4 -d -t $PID $args || return 2
>
> + ps axf > $ddump/ps.after
> +
> for i in `seq 5`; do
> save_fds $PID $ddump/restore.fd
> diff_fds $ddump/dump.fd $ddump/restore.fd && break
> diff --git a/test/zdtm/live/static/Makefile b/test/zdtm/live/static/Makefile
> index 03e40fe..a01fc0a 100644
> --- a/test/zdtm/live/static/Makefile
> +++ b/test/zdtm/live/static/Makefile
> @@ -66,6 +66,7 @@ TST_NOFILE = \
> pty03 \
> pty04 \
> tty00 \
> + tty01 \
> mountpoints \
> netns \
> session01 \
> diff --git a/test/zdtm/live/static/mountpoints.c b/test/zdtm/live/static/mountpoints.c
> index f1d35dd..4c3ce9c 100644
> --- a/test/zdtm/live/static/mountpoints.c
> +++ b/test/zdtm/live/static/mountpoints.c
> @@ -87,7 +87,7 @@ done:
> }
> if (mount("none", MPTS_ROOT"/kernel/sys/fs/binfmt_misc",
> "binfmt_misc", 0, "") < 0) {
> - fail("Can't mount proc");
> + fail("Can't mount binfmt_misc");
> return 1;
> }
>
> diff --git a/test/zdtm/live/static/tty01.c b/test/zdtm/live/static/tty01.c
> new file mode 100644
> index 0000000..8b7da0e
> --- /dev/null
> +++ b/test/zdtm/live/static/tty01.c
> @@ -0,0 +1,127 @@
> +#define _XOPEN_SOURCE
> +#include <stdlib.h>
> +#include "zdtmtst.h"
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +#include <unistd.h>
> +#include <signal.h>
> +#include <sys/wait.h>
> +#include <termios.h>
> +#include <sys/ioctl.h>
> +
> +const char *test_doc = "Check that a control terminal is restored,"
> + "if a proper session leader is absent.";
> +const char *test_author = "Andrey Vagin <avagin at openvz.org>";
> +
> +static int sighup = 0;
> +static void sighup_handler(int signo)
> +{
> + test_msg("SIGHUP is here\n");
> + sighup = 1;
> +}
> +
> +int main(int argc, char ** argv)
> +{
> + int fdm, fds, status;
> + char *slavename;
> + pid_t pid;
> + int p[2];
> +
> + test_init(argc, argv);
> +
> + fdm = open("/dev/ptmx", O_RDWR);
> + if (fdm == -1) {
> + err("Can't open a master pseudoterminal");
> + return 1;
> + }
> +
> + grantpt(fdm);
> + unlockpt(fdm);
> + slavename = ptsname(fdm);
> +
> + if (pipe(p) == -1) {
> + err("Unable to create a pipe");
> + return -1;
> + }
> +
> + pid = test_fork();
> + if (pid < 0) {
> + err("fork() failed");
> + return 1;
> + }
> +
> + if (pid == 0) {
> + close(fdm);
> + close(p[0]);
> +
> + if (setsid() == -1)
> + return 1;
> +
> + /* set up a controlling terminal */
> + fds = open(slavename, O_RDWR);
> + if (fds == -1) {
> + err("Can't open a slave pseudoterminal %s", slavename);
> + return 1;
> + }
> +
> + if (ioctl(fds, TIOCSCTTY, 1) < 0) {
> + err("Can't setup a controlling terminal");
> + return 1;
> + }
> + close(fds);
> +
> + pid = test_fork();
> + if (pid < 0)
> + return -1;
> +
> + if (pid > 0) {
> + if (write(p[1], &pid, sizeof(pid)) != sizeof(pid)) {
> + err("Could not send a pid");
> + return 1;
> + }
> + return 0;
> + }
> + close(p[1]);
> +
> + signal(SIGHUP, sighup_handler);
> +
> + test_waitsig();
> + if (sighup)
> + return 0;
> + return 1;
> + }
> +
> + close(p[1]);
> +
> + test_daemon();
> +
> + pid = waitpid(pid, &status, 0);
> + if (pid < 0)
> + return 1;
> +
> + if (WIFEXITED(status)) {
> + if (WEXITSTATUS(status)) {
> + fail("The child returned %d", WEXITSTATUS(status));
> + return 1;
> + }
> + } else {
> + err("The child has been killed by %d", WTERMSIG(status));
> + return 1;
> + }
> +
> + if (read(p[0], &pid, sizeof(pid)) != sizeof(pid)) {
> + err("Could not get a pid");
> + return 1;
> + }
> +
> + test_waitsig();
> +
> + close(fdm);
> +
> + kill(pid, SIGTERM);
> +
> + pass();
> +
> + return 0;
> +}
> --
> 1.7.11.7
>
More information about the CRIU
mailing list