• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Basic syscall test for Solaris/x86 specific syscalls. */
2 
3 #include "scalar.h"
4 
5 #include <string.h>
6 #include <sys/fcntl.h>
7 #include <sys/lwp.h>
8 #include <sys/statvfs.h>
9 
10 /* Helper functions.  These are necessary if we've got two tests for a single
11    syscall.  In that case, Memcheck can sometimes merge error messages.  Doing
12    each test in its own function prevents that. */
13 __attribute__((noinline))
sys_openat64(void)14 static void sys_openat64(void)
15 {
16    GO(SYS_openat64, "(3-args) 3s 1m");
17    SY(SYS_openat64, x0 - 1, x0, x0); FAILx(EBADF);
18 }
19 
20 __attribute__((noinline))
sys_openat642(void)21 static void sys_openat642(void)
22 {
23    GO(SYS_openat64, "(4-args) 4s 1m");
24    SY(SYS_openat64, x0 - 1, x0, x0 | O_CREAT, x0); FAILx(EBADF);
25 }
26 
27 __attribute__((noinline))
sys_statvfs64(void)28 static void sys_statvfs64(void)
29 {
30    GO(SYS_statvfs64, "2s 2m");
31    SY(SYS_statvfs64, x0 + 1, x0 + 1); FAIL;
32 }
33 
34 __attribute__((noinline))
sys_statvfs642(void)35 static int sys_statvfs642(void)
36 {
37    const char path[] = "/";
38    struct statvfs64 stats;
39 
40    GO(SYS_statvfs64, "4s 0m");
41    SY(SYS_statvfs64, x0 + path, x0 + &stats); SUCC;
42 
43    size_t basetype_len = strlen(stats.f_basetype);
44    size_t fstr_len = strlen(stats.f_fstr);
45 
46    /* Now check that memory after the strings is reported uninitialized. */
47    int x = 0;
48    if (stats.f_basetype[basetype_len + 2] != ' ') x = -1; else x = -2;
49    if (stats.f_fstr[fstr_len + 2] != ' ') x = -3; else x = -4;
50    return x;
51 }
52 
main(void)53 int main(void)
54 {
55    /* Uninitialised, but we know px[0] is 0x0. */
56    long *px = malloc(sizeof(long));
57    x0 = px[0];
58 
59    /* SYS_fstatat64              67 */
60    GO(SYS_fstatat64, "4s 2m");
61    SY(SYS_fstatat64, x0 - 1, x0 + 1, x0, x0); FAILx(EBADF);
62 
63    /* SYS_openat64               69 */
64    sys_openat64();
65    sys_openat642();
66 
67    /* SYS_lwp_private           166 */
68    GO(SYS_lwp_private, "3s 1m");
69    SY(SYS_lwp_private, x0 + _LWP_GETPRIVATE, x0 + _LWP_GSBASE, x0); FAIL;
70 
71    /* SYS_llseek                175 */
72    GO(SYS_llseek, "4s 0m");
73    SY(SYS_llseek, x0 - 1, x0, x0, x0); FAILx(EBADF);
74 
75    /* SYS_getdents64            213 */
76    GO(SYS_getdents64, "3s 1m");
77    SY(SYS_getdents64, x0, x0, x0 + 1); FAIL;
78 
79    /* SYS_mmap64                214 */
80    GO(SYS_mmap64, "7s 0m");
81    SY(SYS_mmap64, x0, x0, x0, x0, x0, x0, x0); FAILx(EINVAL);
82 
83    /* SYS_stat64                215 */
84    /* Tested in x86-solaris/scalar_obsolete.c. */
85 
86    /* SYS_lstat64               216 */
87    /* Tested in x86-solaris/scalar_obsolete.c. */
88 
89    /* SYS_fstat64               217 */
90    /* Tested in x86-solaris/scalar_obsolete.c. */
91 
92    /* SYS_statvfs64             218 */
93    sys_statvfs64();
94    sys_statvfs642();
95 
96    /* SYS_fstatvfs64            219 */
97    GO(SYS_fstatvfs64, "2s 1m");
98    SY(SYS_fstatvfs64, x0 - 1, x0 + 1); FAILx(EBADF);
99 
100    /* SYS_setrlimit64           220 */
101    GO(SYS_setrlimit64, "2s 1m");
102    SY(SYS_setrlimit64, x0, x0); FAIL;
103 
104    /* SYS_getrlimit64           221 */
105    GO(SYS_getrlimit64, "2s 1m");
106    SY(SYS_getrlimit64, x0, x0); FAIL;
107 
108    /* SYS_pread64               222 */
109    GO(SYS_pread64, "5s 1m");
110    SY(SYS_pread64, x0 - 1, x0, x0 + 1, x0, x0); FAILx(EBADF);
111 
112    /* SYS_pwrite64              223 */
113    GO(SYS_pwrite64, "5s 1m");
114    SY(SYS_pwrite64, x0 - 1, x0, x0 + 1, x0, x0); FAILx(EBADF);
115 
116    /* SYS_open64                225 */
117    /* Tested in x86-solaris/scalar_obsolete.c. */
118 
119    return 0;
120 }
121 
122