Imported Upstream version 20080930
[ltp-debian.git] / testcases / kernel / syscalls / ptrace / ptrace06.c
blob8639c8ce8ca41c3631554225401ed404a3ded99e
1 /*
2 * check out-of-bound/unaligned addresses given to
3 * - {PEEK,POKE}{DATA,TEXT,USER}
4 * - {GET,SET}{,FG}REGS
5 * - {GET,SET}SIGINFO
7 * Copyright (c) 2008 Analog Devices Inc.
9 * Licensed under the GPL-2 or later
12 #include <errno.h>
13 #include <stdbool.h>
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <unistd.h>
17 #include <sys/ptrace.h>
18 #include <linux/ptrace.h>
19 #include <asm/ptrace.h>
21 #include "test.h"
22 #include "usctest.h"
23 #include "spawn_ptrace_child.c"
25 char *TCID = "ptrace06";
27 struct test_case_t {
28 enum __ptrace_request request;
29 long addr;
30 long data;
31 } test_cases[] = {
32 { PTRACE_PEEKDATA, .addr = 0 },
33 { PTRACE_PEEKDATA, .addr = 1 },
34 { PTRACE_PEEKDATA, .addr = 2 },
35 { PTRACE_PEEKDATA, .addr = 3 },
36 { PTRACE_PEEKDATA, .addr = -1 },
37 { PTRACE_PEEKDATA, .addr = -2 },
38 { PTRACE_PEEKDATA, .addr = -3 },
40 { PTRACE_PEEKTEXT, .addr = 0 },
41 { PTRACE_PEEKTEXT, .addr = 1 },
42 { PTRACE_PEEKTEXT, .addr = 2 },
43 { PTRACE_PEEKTEXT, .addr = 3 },
44 { PTRACE_PEEKTEXT, .addr = -1 },
45 { PTRACE_PEEKTEXT, .addr = -2 },
46 { PTRACE_PEEKTEXT, .addr = -3 },
47 { PTRACE_PEEKTEXT, .addr = -1 },
49 { PTRACE_PEEKUSER, .addr = sizeof(struct pt_regs) * 3 + 0 },
50 { PTRACE_PEEKUSER, .addr = sizeof(struct pt_regs) * 3 + 1 },
51 { PTRACE_PEEKUSER, .addr = sizeof(struct pt_regs) * 3 + 2 },
52 { PTRACE_PEEKUSER, .addr = sizeof(struct pt_regs) * 3 + 3 },
53 { PTRACE_PEEKUSER, .addr = -1 },
54 { PTRACE_PEEKUSER, .addr = -2 },
55 { PTRACE_PEEKUSER, .addr = -3 },
57 { PTRACE_POKEDATA, .addr = 0 },
58 { PTRACE_POKEDATA, .addr = 1 },
59 { PTRACE_POKEDATA, .addr = 2 },
60 { PTRACE_POKEDATA, .addr = 3 },
61 { PTRACE_POKEDATA, .addr = -1 },
62 { PTRACE_POKEDATA, .addr = -2 },
63 { PTRACE_POKEDATA, .addr = -3 },
65 { PTRACE_POKETEXT, .addr = 0 },
66 { PTRACE_POKETEXT, .addr = 1 },
67 { PTRACE_POKETEXT, .addr = 2 },
68 { PTRACE_POKETEXT, .addr = 3 },
69 { PTRACE_POKETEXT, .addr = -1 },
70 { PTRACE_POKETEXT, .addr = -2 },
71 { PTRACE_POKETEXT, .addr = -3 },
73 { PTRACE_POKEUSER, .addr = sizeof(struct pt_regs) * 3 + 0 },
74 { PTRACE_POKEUSER, .addr = sizeof(struct pt_regs) * 3 + 1 },
75 { PTRACE_POKEUSER, .addr = sizeof(struct pt_regs) * 3 + 2 },
76 { PTRACE_POKEUSER, .addr = sizeof(struct pt_regs) * 3 + 3 },
77 { PTRACE_POKEUSER, .addr = -1 },
78 { PTRACE_POKEUSER, .addr = -2 },
79 { PTRACE_POKEUSER, .addr = -3 },
81 { PTRACE_GETREGS, .data = 0 },
82 { PTRACE_GETREGS, .data = 1 },
83 { PTRACE_GETREGS, .data = 2 },
84 { PTRACE_GETREGS, .data = 3 },
85 { PTRACE_GETREGS, .data = -1 },
86 { PTRACE_GETREGS, .data = -2 },
87 { PTRACE_GETREGS, .data = -3 },
89 #ifdef PTRACE_GETFGREGS
90 { PTRACE_GETFGREGS, .data = 0 },
91 { PTRACE_GETFGREGS, .data = 1 },
92 { PTRACE_GETFGREGS, .data = 2 },
93 { PTRACE_GETFGREGS, .data = 3 },
94 { PTRACE_GETFGREGS, .data = -1 },
95 { PTRACE_GETFGREGS, .data = -2 },
96 { PTRACE_GETFGREGS, .data = -3 },
97 #endif
99 { PTRACE_SETREGS, .data = 0 },
100 { PTRACE_SETREGS, .data = 1 },
101 { PTRACE_SETREGS, .data = 2 },
102 { PTRACE_SETREGS, .data = 3 },
103 { PTRACE_SETREGS, .data = -1 },
104 { PTRACE_SETREGS, .data = -2 },
105 { PTRACE_SETREGS, .data = -3 },
107 #ifdef PTRACE_SETFGREGS
108 { PTRACE_SETFGREGS, .data = 0 },
109 { PTRACE_SETFGREGS, .data = 1 },
110 { PTRACE_SETFGREGS, .data = 2 },
111 { PTRACE_SETFGREGS, .data = 3 },
112 { PTRACE_SETFGREGS, .data = -1 },
113 { PTRACE_SETFGREGS, .data = -2 },
114 { PTRACE_SETFGREGS, .data = -3 },
115 #endif
117 { PTRACE_GETSIGINFO, .data = 0 },
118 { PTRACE_GETSIGINFO, .data = 1 },
119 { PTRACE_GETSIGINFO, .data = 2 },
120 { PTRACE_GETSIGINFO, .data = 3 },
121 { PTRACE_GETSIGINFO, .data = -1 },
122 { PTRACE_GETSIGINFO, .data = -2 },
123 { PTRACE_GETSIGINFO, .data = -3 },
125 { PTRACE_SETSIGINFO, .data = 0 },
126 { PTRACE_SETSIGINFO, .data = 1 },
127 { PTRACE_SETSIGINFO, .data = 2 },
128 { PTRACE_SETSIGINFO, .data = 3 },
129 { PTRACE_SETSIGINFO, .data = -1 },
130 { PTRACE_SETSIGINFO, .data = -2 },
131 { PTRACE_SETSIGINFO, .data = -3 },
134 int TST_TOTAL = ARRAY_SIZE(test_cases);
136 int main(int argc, char *argv[])
138 size_t i;
139 long ret;
140 int saved_errno;
141 char *msg;
143 if ((msg = parse_opts(argc, argv, NULL, NULL)))
144 tst_brkm(TBROK, tst_exit, "OPTION PARSING ERROR - %s", msg);
146 make_a_baby(argc, argv);
148 for (i = 0; i < ARRAY_SIZE(test_cases); ++i) {
149 struct test_case_t *tc = &test_cases[i];
151 errno = 0;
152 ret = ptrace(tc->request, pid, (void *)tc->addr, (void *)tc->data);
153 saved_errno = errno;
154 if (ret != -1)
155 tst_resm(TFAIL, "ptrace(%s, ..., %p, %p) returned %li instead of -1",
156 strptrace(tc->request), tc->addr, tc->data, ret);
157 else if (saved_errno != EIO && saved_errno != EFAULT)
158 tst_resm(TFAIL, "ptrace(%s, ..., %p, %p) expected errno EIO or EFAULT; actual: %i (%s)",
159 strptrace(tc->request), tc->addr, tc->data,
160 saved_errno, strerror(saved_errno));
161 else
162 tst_resm(TPASS, "ptrace(%s, ..., %p, %p) failed as expected",
163 strptrace(tc->request), tc->addr, tc->data);
166 /* hopefully this worked */
167 ptrace(PTRACE_KILL, pid, NULL, NULL);
169 tst_exit();