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