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