[CRIU] [PATCH 19/19] zdtm: Add scm06 test

Andrei Vagin avagin at virtuozzo.com
Wed Jan 31 21:35:12 MSK 2018


On Tue, Jan 30, 2018 at 06:43:41PM +0300, Kirill Tkhai wrote:
> This test makes looped unix sockets queues and tries
> to iterate over them after the restore.
> 
> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> ---
>  test/zdtm/static/Makefile   |    1 
>  test/zdtm/static/scm06.c    |  122 +++++++++++++++++++++++++++++++++++++++++++
>  test/zdtm/static/scm06.desc |    1 
>  3 files changed, 124 insertions(+)
>  create mode 100644 test/zdtm/static/scm06.c
>  create mode 100644 test/zdtm/static/scm06.desc
> 
> diff --git a/test/zdtm/static/Makefile b/test/zdtm/static/Makefile
> index 5a9fd1046..99a57033f 100644
> --- a/test/zdtm/static/Makefile
> +++ b/test/zdtm/static/Makefile
> @@ -173,6 +173,7 @@ TST_NOFILE	:=				\
>  		scm03				\
>  		scm04				\
>  		scm05				\
> +		scm06				\
>  		aio00				\
>  		aio01				\
>  		fd				\
> diff --git a/test/zdtm/static/scm06.c b/test/zdtm/static/scm06.c
> new file mode 100644
> index 000000000..c92dac60d
> --- /dev/null
> +++ b/test/zdtm/static/scm06.c
> @@ -0,0 +1,122 @@
> +#include <sys/resource.h>
> +#include <errno.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <sys/socket.h>
> +#include <sys/un.h>
> +#include <sys/epoll.h>
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +
> +#include "zdtmtst.h"
> +
> +const char *test_doc	= "Check that SCM_RIGHTS are preserved";
> +const char *test_author	= "Kirill Tkhai <ktkhai at virtuozzo.com>";
> +
> +static int send_fd(int via, int fd)
> +{
> +	struct msghdr h = {};
> +	struct cmsghdr *ch;
> +	struct iovec iov;
> +	char buf[CMSG_SPACE(sizeof(int))];
> +	char c = '\0';
> +	int *fdp;
> +
> +	memset(buf, 0, sizeof(buf));
> +	h.msg_control = buf;
> +	h.msg_controllen = sizeof(buf);
> +	ch = CMSG_FIRSTHDR(&h);
> +	ch->cmsg_level = SOL_SOCKET;
> +	ch->cmsg_type = SCM_RIGHTS;
> +	ch->cmsg_len = CMSG_LEN(sizeof(int));
> +	fdp = (int *)CMSG_DATA(ch);
> +	fdp[0] = fd;
> +
> +	h.msg_iov = &iov;
> +	h.msg_iovlen = 1;
> +	iov.iov_base = &c;
> +	iov.iov_len = sizeof(c);
> +
> +	if (sendmsg(via, &h, 0) <= 0)
> +		return -1;
> +
> +	return 0;
> +}
> +
> +static int recv_fd(int via, int *fd)
> +{
> +	struct msghdr h = {};
> +	struct cmsghdr *ch;
> +	struct iovec iov;
> +	char buf[CMSG_SPACE(sizeof(int))];
> +	char c;
> +	int *fdp;
> +
> +	h.msg_control = buf;
> +	h.msg_controllen = sizeof(buf);
> +	h.msg_iov = &iov;
> +	h.msg_iovlen = 1;
> +	iov.iov_base = &c;
> +	iov.iov_len = sizeof(c);
> +
> +	if (recvmsg(via, &h, 0) <= 0)
> +		return -1;
> +
> +	if (h.msg_flags & MSG_CTRUNC) {
> +		test_msg("CTR\n");
> +		return -2;
> +	}
> +
> +	/* No 2 SCM-s here, kernel merges them upon send */
> +	ch = CMSG_FIRSTHDR(&h);
> +	if (h.msg_flags & MSG_TRUNC)
> +		return -2;
> +	if (ch == NULL)
> +		return -3;
> +	if (ch->cmsg_type != SCM_RIGHTS)
> +		return -4;
> +
> +	fdp = (int *)CMSG_DATA(ch);
> +	*fd = fdp[0];
> +	return 0;
> +}
> +
> +int main(int argc, char **argv)
> +{
> +	int ska[2], skc, i, j, ret;
> +
> +	test_init(argc, argv);
> +
> +	if (socketpair(PF_UNIX, SOCK_DGRAM, 0, ska) < 0) {
> +		pr_perror("Can't make unix pair");
> +		exit(1);
> +	}
> +
> +	/* Make the vinaigrette */
> +	for (i = 0; i < 2; i++) {
> +		for (j = 0; j < 2; j++) {
> +			if (send_fd(ska[i], ska[j]) < 0) {
> +				pr_perror("Can't send sk");
> +				exit(1);
> +			}
> +		}
> +	}
> +
> +	test_daemon();
> +	test_waitsig();
> +
> +	skc = ska[0];
> +	for (i = 0; i < 3; i++) {
> +		if (recv_fd(skc, &skc) < 0) {

Pls, check that you get a correct file descriptor. You can queue two
sockets and each socket can have something in a receive queue.

> +			fail("Can't recv");
> +			ret = -1;
> +			goto out;
> +		}
> +	}
> +
> +	pass();
> +	ret = 0;
> +out:
> +	return ret;
> +}
> diff --git a/test/zdtm/static/scm06.desc b/test/zdtm/static/scm06.desc
> new file mode 100644
> index 000000000..2eac7e654
> --- /dev/null
> +++ b/test/zdtm/static/scm06.desc
> @@ -0,0 +1 @@
> +{'flags': 'suid'}
> 


More information about the CRIU mailing list