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