xref: /xnu-11215.1.10/tests/unp_externalize_fd_alloc.c (revision 8d741a5de7ff4191bf97d57b9f54c2f6d4a15585)
1*8d741a5dSApple OSS Distributions /*
2*8d741a5dSApple OSS Distributions  * Copyright (c) 2021 Apple Inc. All rights reserved.
3*8d741a5dSApple OSS Distributions  */
4*8d741a5dSApple OSS Distributions 
5*8d741a5dSApple OSS Distributions #include <stdio.h>
6*8d741a5dSApple OSS Distributions #include <sys/socket.h>
7*8d741a5dSApple OSS Distributions #include <sys/resource.h>
8*8d741a5dSApple OSS Distributions #include <errno.h>
9*8d741a5dSApple OSS Distributions 
10*8d741a5dSApple OSS Distributions #include <darwintest.h>
11*8d741a5dSApple OSS Distributions #include <darwintest_utils.h>
12*8d741a5dSApple OSS Distributions 
13*8d741a5dSApple OSS Distributions #define SCM_RIGHTS                      0x01
14*8d741a5dSApple OSS Distributions 
15*8d741a5dSApple OSS Distributions T_DECL(scm_rights_control_msg, "Test the fd alloc failure behavior with SCM_RIGHTS control msg")
16*8d741a5dSApple OSS Distributions {
17*8d741a5dSApple OSS Distributions 	T_SETUPBEGIN;
18*8d741a5dSApple OSS Distributions 	int res, sock[2];
19*8d741a5dSApple OSS Distributions 
20*8d741a5dSApple OSS Distributions 	int fd = open("/dev/null", O_RDWR);
21*8d741a5dSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(fd, "open(/dev/null)");
22*8d741a5dSApple OSS Distributions 
23*8d741a5dSApple OSS Distributions 	struct rlimit rlim = { 6, 6 };
24*8d741a5dSApple OSS Distributions 	setrlimit(RLIMIT_NOFILE, &rlim);
25*8d741a5dSApple OSS Distributions 
26*8d741a5dSApple OSS Distributions 	res = socketpair(AF_UNIX, SOCK_STREAM, 0, sock);
27*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_TRUE(sock[0] >= 0, "failed to create socket");
28*8d741a5dSApple OSS Distributions 
29*8d741a5dSApple OSS Distributions 	struct iovec iovec[1];
30*8d741a5dSApple OSS Distributions 	struct msghdr msg = {0};
31*8d741a5dSApple OSS Distributions 	struct cmsghdr *cmsghdr;
32*8d741a5dSApple OSS Distributions 	char buf[CMSG_SPACE(sizeof(int))];
33*8d741a5dSApple OSS Distributions 
34*8d741a5dSApple OSS Distributions 	iovec[0].iov_base = "";
35*8d741a5dSApple OSS Distributions 	iovec[0].iov_len = 1;
36*8d741a5dSApple OSS Distributions 
37*8d741a5dSApple OSS Distributions 	msg.msg_iov = iovec;
38*8d741a5dSApple OSS Distributions 	msg.msg_iovlen = 1;
39*8d741a5dSApple OSS Distributions 	msg.msg_control = buf;
40*8d741a5dSApple OSS Distributions 	msg.msg_controllen = CMSG_SPACE(sizeof(int));
41*8d741a5dSApple OSS Distributions 
42*8d741a5dSApple OSS Distributions 	cmsghdr = CMSG_FIRSTHDR(&msg);
43*8d741a5dSApple OSS Distributions 	cmsghdr->cmsg_len = CMSG_LEN(sizeof(int));
44*8d741a5dSApple OSS Distributions 	cmsghdr->cmsg_level = SOL_SOCKET;
45*8d741a5dSApple OSS Distributions 	cmsghdr->cmsg_type = SCM_RIGHTS;
46*8d741a5dSApple OSS Distributions 	memcpy(CMSG_DATA(cmsghdr), &fd, sizeof(fd));
47*8d741a5dSApple OSS Distributions 
48*8d741a5dSApple OSS Distributions 	T_SETUPEND;
49*8d741a5dSApple OSS Distributions 
50*8d741a5dSApple OSS Distributions 	sendmsg(sock[1], &msg, 0);
51*8d741a5dSApple OSS Distributions 
52*8d741a5dSApple OSS Distributions 	u_char c;
53*8d741a5dSApple OSS Distributions 	struct iovec riovec[1];
54*8d741a5dSApple OSS Distributions 	struct msghdr rmsg = { 0, };
55*8d741a5dSApple OSS Distributions 	char rbuf[CMSG_SPACE(sizeof(int))];
56*8d741a5dSApple OSS Distributions 
57*8d741a5dSApple OSS Distributions 	riovec[0].iov_base = &c;
58*8d741a5dSApple OSS Distributions 	riovec[0].iov_len = 1;
59*8d741a5dSApple OSS Distributions 
60*8d741a5dSApple OSS Distributions 	rmsg.msg_iov = riovec;
61*8d741a5dSApple OSS Distributions 	rmsg.msg_iovlen = 1;
62*8d741a5dSApple OSS Distributions 	rmsg.msg_control = rbuf;
63*8d741a5dSApple OSS Distributions 	rmsg.msg_controllen = CMSG_SPACE(sizeof(int));
64*8d741a5dSApple OSS Distributions 
65*8d741a5dSApple OSS Distributions 	ssize_t ret = recvmsg(sock[0], &rmsg, 0);
66*8d741a5dSApple OSS Distributions 	T_ASSERT_TRUE(ret == -1, "recvmsg should fail");
67*8d741a5dSApple OSS Distributions 	T_ASSERT_TRUE(errno == 24, "the fail code is EMFILE");
68*8d741a5dSApple OSS Distributions 
69*8d741a5dSApple OSS Distributions 	close(fd);
70*8d741a5dSApple OSS Distributions 	close(sock[0]);
71*8d741a5dSApple OSS Distributions 	close(sock[1]);
72*8d741a5dSApple OSS Distributions }
73