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