1*4f1223e8SApple OSS Distributions /* 2*4f1223e8SApple OSS Distributions * Copyright (c) 2024 Apple Inc. All rights reserved. 3*4f1223e8SApple OSS Distributions * 4*4f1223e8SApple OSS Distributions * Chris Jarrett-Davies <[email protected]> 5*4f1223e8SApple OSS Distributions * SEAR Red Team / 2024-Mar-20 6*4f1223e8SApple OSS Distributions */ 7*4f1223e8SApple OSS Distributions 8*4f1223e8SApple OSS Distributions #include <darwintest.h> 9*4f1223e8SApple OSS Distributions #include <stdio.h> 10*4f1223e8SApple OSS Distributions 11*4f1223e8SApple OSS Distributions #include <darwintest.h> 12*4f1223e8SApple OSS Distributions 13*4f1223e8SApple OSS Distributions #include <string.h> 14*4f1223e8SApple OSS Distributions #include <strings.h> 15*4f1223e8SApple OSS Distributions 16*4f1223e8SApple OSS Distributions #include <arpa/inet.h> 17*4f1223e8SApple OSS Distributions #include <netinet/in.h> 18*4f1223e8SApple OSS Distributions #include <sys/socket.h> 19*4f1223e8SApple OSS Distributions #include <unistd.h> 20*4f1223e8SApple OSS Distributions 21*4f1223e8SApple OSS Distributions T_GLOBAL_META( 22*4f1223e8SApple OSS Distributions T_META_NAMESPACE("xnu.net"), 23*4f1223e8SApple OSS Distributions T_META_ASROOT(true), 24*4f1223e8SApple OSS Distributions T_META_RADAR_COMPONENT_NAME("xnu"), 25*4f1223e8SApple OSS Distributions T_META_RADAR_COMPONENT_VERSION("networking"), 26*4f1223e8SApple OSS Distributions T_META_ENABLED(!TARGET_OS_BRIDGE), 27*4f1223e8SApple OSS Distributions T_META_CHECK_LEAKS(false)); 28*4f1223e8SApple OSS Distributions 29*4f1223e8SApple OSS Distributions T_DECL(v4mappedv6_join_group, "Tests setting IPV6_JOIN_GROUP on an IPv4-mapped IPv6 address") 30*4f1223e8SApple OSS Distributions { 31*4f1223e8SApple OSS Distributions int s; 32*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 33*4f1223e8SApple OSS Distributions .sin6_family = AF_INET6, 34*4f1223e8SApple OSS Distributions .sin6_len = sizeof(struct sockaddr_in6), 35*4f1223e8SApple OSS Distributions .sin6_port = 1337 36*4f1223e8SApple OSS Distributions }; 37*4f1223e8SApple OSS Distributions struct ipv6_mreq mreq = {}; 38*4f1223e8SApple OSS Distributions 39*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), "create socket"); 40*4f1223e8SApple OSS Distributions 41*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6.sin6_addr), "inet_pton"); 42*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(connect(s, (const struct sockaddr *)&sin6, sizeof(sin6)), "connect"); 43*4f1223e8SApple OSS Distributions 44*4f1223e8SApple OSS Distributions memset((unsigned char *)&mreq.ipv6mr_multiaddr, 0xff, 16); 45*4f1223e8SApple OSS Distributions 46*4f1223e8SApple OSS Distributions // This should now fail (but not panic) 47*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_FAILURE(setsockopt(s, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq)), EADDRNOTAVAIL, "setsockopt IPV6_JOIN_GROUP"); 48*4f1223e8SApple OSS Distributions } 49