1 /* 2 * Check decoding of out-of-range syscalls. 3 * 4 * Copyright (c) 2015-2016 Dmitry V. Levin <ldv (at) 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 #include "tests.h" 31 #include "sysent.h" 32 #include <errno.h> 33 #include <stdio.h> 34 #include <unistd.h> 35 #include <asm/unistd.h> 36 37 #define TD 0 38 #define TF 0 39 #define TI 0 40 #define TN 0 41 #define TP 0 42 #define TS 0 43 #define TM 0 44 #define NF 0 45 #define MA 0 46 #define SI 0 47 #define SE 0 48 #define CST 0 49 #define SEN(arg) 0,0 50 51 static const struct_sysent syscallent[] = { 52 #include "syscallent.h" 53 }; 54 55 #if defined __X32_SYSCALL_BIT && defined __NR_read \ 56 && (__X32_SYSCALL_BIT & __NR_read) != 0 57 # define SYSCALL_BIT __X32_SYSCALL_BIT 58 #else 59 # define SYSCALL_BIT 0 60 #endif 61 62 static void 63 test_syscall(const unsigned long nr) 64 { 65 static const kernel_ulong_t a[] = { 66 (kernel_ulong_t) 0xface0fedbadc0dedULL, 67 (kernel_ulong_t) 0xface1fedbadc1dedULL, 68 (kernel_ulong_t) 0xface2fedbadc2dedULL, 69 (kernel_ulong_t) 0xface3fedbadc3dedULL, 70 (kernel_ulong_t) 0xface4fedbadc4dedULL, 71 (kernel_ulong_t) 0xface5fedbadc5dedULL 72 }; 73 74 long rc = syscall(nr | SYSCALL_BIT, 75 a[0], a[1], a[2], a[3], a[4], a[5]); 76 #ifdef LINUX_MIPSO32 77 printf("syscall(%#lx, %#lx, %#lx, %#lx, %#lx, %#lx, %#lx)" 78 " = %ld ENOSYS (%m)\n", nr | SYSCALL_BIT, 79 a[0], a[1], a[2], a[3], a[4], a[5], rc); 80 #else 81 printf("syscall_%lu(%#llx, %#llx, %#llx, %#llx, %#llx, %#llx)" 82 " = %ld (errno %d)\n", nr, 83 (unsigned long long) a[0], 84 (unsigned long long) a[1], 85 (unsigned long long) a[2], 86 (unsigned long long) a[3], 87 (unsigned long long) a[4], 88 (unsigned long long) a[5], 89 rc, errno); 90 #endif 91 } 92 93 int 94 main(void) 95 { 96 test_syscall(ARRAY_SIZE(syscallent)); 97 98 #ifdef SYS_socket_subcall 99 test_syscall(SYS_socket_subcall + 1); 100 #endif 101 102 #ifdef SYS_ipc_subcall 103 test_syscall(SYS_ipc_subcall + 1); 104 #endif 105 106 puts("+++ exited with 0 +++"); 107 return 0; 108 } 109