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