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