1 /* 2 * uds-to-self.c 3 * 4 * Test for rdar://137498122 (panic when calling unp_get_locks_in_order without checking if the 2 sockets are equal). 5 */ 6 7 #include <sys/socket.h> 8 #include <sys/ucred.h> 9 #include <sys/un.h> 10 11 #include <limits.h> 12 #include <stdio.h> 13 #include <string.h> 14 #include <unistd.h> 15 16 #include <darwintest.h> 17 18 static char buffer[LINE_MAX]; 19 20 #define FILE_PATH "/tmp/uds-to-self.sock" 21 22 T_GLOBAL_META( 23 T_META_NAMESPACE("xnu.net"), 24 T_META_RADAR_COMPONENT_NAME("xnu"), 25 T_META_RADAR_COMPONENT_VERSION("networking"), 26 T_META_CHECK_LEAKS(false)); 27 28 29 T_DECL(uds_self_connection, "self-connecting Unix domain sockets") 30 { 31 int fd; 32 struct sockaddr_un sun = { 0 }; 33 socklen_t solen; 34 ssize_t nsent; 35 ssize_t nrcvd; 36 struct xucred xucred; 37 pid_t pid; 38 uuid_t uuid; 39 audit_token_t token; 40 41 T_ASSERT_POSIX_SUCCESS(fd = socket(AF_UNIX, SOCK_DGRAM, 0), NULL); 42 43 sun.sun_family = AF_UNIX; 44 snprintf(sun.sun_path, sizeof(sun.sun_path), FILE_PATH); 45 sun.sun_len = (unsigned char) SUN_LEN(&sun); 46 47 unlink(FILE_PATH); 48 49 T_ASSERT_POSIX_SUCCESS(bind(fd, (struct sockaddr *)&sun, sun.sun_len), NULL); 50 51 solen = sizeof(struct sockaddr_un); 52 T_ASSERT_POSIX_SUCCESS(getsockname(fd, (struct sockaddr *)&sun, &solen), NULL); 53 T_LOG("socket bound to %s", sun.sun_path); 54 55 T_ASSERT_POSIX_SUCCESS(connect(fd, (struct sockaddr *)&sun, sun.sun_len), NULL); 56 57 T_ASSERT_POSIX_SUCCESS(getpeername(fd, (struct sockaddr *)&sun, &solen), NULL); 58 T_LOG("socket connected to %s", sun.sun_path); 59 60 T_ASSERT_POSIX_SUCCESS(nsent = send(fd, buffer, strlen(buffer) + 1, 0), NULL); 61 T_LOG("send %ld bytes\n", nsent); 62 63 T_ASSERT_POSIX_SUCCESS(nrcvd = recv(fd, buffer, sizeof(buffer), 0), NULL); 64 65 /* 66 * The return value of getsockopt() is not important, what matters is to not panic 67 */ 68 solen = sizeof(xucred); 69 (void)getsockopt(fd, SOL_LOCAL, LOCAL_PEERCRED, &xucred, &solen); 70 71 solen = sizeof(pid); 72 (void)getsockopt(fd, SOL_LOCAL, LOCAL_PEERPID, &pid, &solen); 73 74 solen = sizeof(pid); 75 (void)getsockopt(fd, SOL_LOCAL, LOCAL_PEEREPID, &pid, &solen); 76 77 solen = sizeof(uuid); 78 (void)getsockopt(fd, SOL_LOCAL, LOCAL_PEERUUID, &uuid, &solen); 79 80 solen = sizeof(uuid); 81 (void)getsockopt(fd, SOL_LOCAL, LOCAL_PEEREUUID, &uuid, &solen); 82 83 solen = sizeof(token); 84 (void)getsockopt(fd, SOL_LOCAL, LOCAL_PEERTOKEN, &token, &solen); 85 86 T_ASSERT_POSIX_SUCCESS(shutdown(fd, SHUT_RDWR), NULL); 87 88 T_ASSERT_POSIX_SUCCESS(close(fd), NULL); 89 90 unlink(FILE_PATH); 91 } 92