1 /* Scalar test for new spawn syscall available on Solaris 11. */
2
3 #include "scalar.h"
4
5 #include <sys/spawn_impl.h>
6
7 __attribute__((noinline))
sys_spawn(void)8 static void sys_spawn(void)
9 {
10 GO(SYS_spawn, "5s 7m");
11 SY(SYS_spawn, x0 + 1, x0 + 1, x0 - 1, x0 + 1, x0 - 1); FAIL;
12 }
13
14 __attribute__((noinline))
sys_spawn2(void)15 static void sys_spawn2(void)
16 {
17 kspawn_attr_t ksa;
18 ksa.ksa_version = x0 + SPAWN_VERSION;
19 ksa.ksa_size = x0 + sizeof(ksa);
20 ksa.ksa_attr_off = x0 + 0;
21 ksa.ksa_path_off = x0 + 0;
22 ksa.ksa_shell_off = x0 + 0;
23 char *argenv = "";
24
25 GO(SYS_spawn, "9s 1m");
26 SY(SYS_spawn, x0 + 1, x0 + &ksa, sizeof(ksa), x0 + argenv, x0 + 1); FAIL;
27 }
28
29 __attribute__((noinline))
sys_spawn3(void)30 static void sys_spawn3(void)
31 {
32 kspawn_attr_t ksa;
33 ksa.ksa_version = x0 + SPAWN_VERSION;
34 ksa.ksa_size = x0 + 0xbadcaffe;
35 ksa.ksa_attr_off = x0 + 0xbadcaffe;
36 ksa.ksa_attr_size = x0 + 1;
37 ksa.ksa_path_off = x0 + 0xdeadcaffe;
38 ksa.ksa_path_size = x0 + 2;
39 ksa.ksa_shell_off = x0 + 0xdeadcaffe;
40 ksa.ksa_shell_size = x0 + 3;
41 char *argenv = "\1arg1\0\1arg2\0\1arg3\0\0\1env1\0\1env2\0\0";
42
43 GO(SYS_spawn, "13s 4m");
44 SY(SYS_spawn, x0 + 1, x0 + &ksa, x0 + 0xbadcaffe,
45 x0 + argenv, x0 + sizeof(argenv)); FAIL;
46 }
47
48 __attribute__((noinline))
sys_spawn4(void)49 static void sys_spawn4(void)
50 {
51 char path[] = "/bin/sh";
52 char *argenv = "\2arg1\0\0";
53
54 GO(SYS_spawn, "4s 0m");
55 SY(SYS_spawn, path, x0, x0, x0 + argenv, x0 + sizeof(argenv));
56 FAILx(EINVAL);
57 }
58
main(void)59 int main(void)
60 {
61 /* Uninitialised, but we know px[0] is 0x0. */
62 long *px = malloc(sizeof(long));
63 x0 = px[0];
64
65 /* SYS_spawn 2 */
66 sys_spawn();
67 sys_spawn2();
68 sys_spawn3();
69 sys_spawn4();
70
71 return 0;
72 }
73