1 /* 2 * Check decoding of sockaddr related arguments of recvfrom syscall. 3 * 4 * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. The name of the author may not be used to endorse or promote products 16 * derived from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #define TEST_SYSCALL_NAME recvfrom 31 #define TEST_SYSCALL_PREPARE send_un() 32 #define PREFIX_S_ARGS , recv_buf, 1, 0 33 #define PREFIX_S_STR ", \"A\", 1, 0" 34 #define PREFIX_F_ARGS , 0, 1, 0 35 #define PREFIX_F_STR ", NULL, 1, 0" 36 static void send_un(void); 37 static char recv_buf[1]; 38 #include "sockname.c" 39 40 static int cfd; 41 42 static void 43 send_un(void) 44 { 45 if (send(cfd, "A", 1, 0) != 1) 46 perror_msg_and_skip("send"); 47 } 48 49 int 50 main(void) 51 { 52 cfd = socket(AF_UNIX, SOCK_STREAM, 0); 53 int lfd = socket(AF_UNIX, SOCK_STREAM, 0); 54 if (cfd < 0 || lfd < 0) 55 perror_msg_and_skip("socket"); 56 57 struct sockaddr_un un = { 58 .sun_family = AF_UNIX, 59 .sun_path = TEST_SOCKET ".send" 60 }; 61 62 (void) unlink(un.sun_path); 63 if (bind(cfd, (const void *) &un, sizeof(un))) 64 perror_msg_and_skip("bind"); 65 (void) unlink(un.sun_path); 66 67 un.sun_path[sizeof(TEST_SOCKET) - 1] = '\0'; 68 (void) unlink(un.sun_path); 69 70 if (bind(lfd, (const void *) &un, sizeof(un))) 71 perror_msg_and_skip("bind"); 72 73 if (listen(lfd, 1)) 74 perror_msg_and_skip("listen"); 75 76 if (connect(cfd, (const void *) &un, sizeof(un))) 77 perror_msg_and_skip("connect"); 78 79 int afd = accept(lfd, 0, 0); 80 if (afd < 0) 81 perror_msg_and_skip("accept"); 82 83 (void) unlink(un.sun_path); 84 85 test_sockname_syscall(afd); 86 87 puts("+++ exited with 0 +++"); 88 return 0; 89 } 90