blob: f0a84e9f452c3d2c60b7f77ba3820ed229a5e120 [file] [log] [blame]
vapier84354092008-09-26 23:01:20 +00001/*
2 * check out-of-bound/unaligned addresses given to
3 * - {PEEK,POKE}{DATA,TEXT,USER}
4 * - {GET,SET}{,FG}REGS
5 * - {GET,SET}SIGINFO
6 *
7 * Copyright (c) 2008 Analog Devices Inc.
8 *
9 * Licensed under the GPL-2 or later
10 */
11
vapier9a9a5692008-12-11 09:56:27 +000012#define _GNU_SOURCE
13
vapier84354092008-09-26 23:01:20 +000014#include <errno.h>
15#include <stdbool.h>
16#include <stdio.h>
17#include <stdlib.h>
18#include <unistd.h>
19#include <sys/ptrace.h>
20#include <linux/ptrace.h>
21#include <asm/ptrace.h>
22
23#include "test.h"
24#include "usctest.h"
subrata_modak90a8fb42008-10-15 14:38:51 +000025#include "spawn_ptrace_child.h"
vapier84354092008-09-26 23:01:20 +000026
vapiere68d2eb2008-11-02 06:06:44 +000027/* this should be sizeof(struct user), but that info is only found
28 * in the kernel asm/user.h which is not exported to userspace.
29 */
30#if defined(__i386__)
31# define SIZEOF_USER 284
32#elif defined(__x86_64__)
33# define SIZEOF_USER 928
34#else
vapiera469a372009-05-26 02:53:28 +000035# define SIZEOF_USER 0x1000 /* just pick a big number */
vapiere68d2eb2008-11-02 06:06:44 +000036#endif
37
vapier84354092008-09-26 23:01:20 +000038char *TCID = "ptrace06";
39
40struct test_case_t {
41 enum __ptrace_request request;
42 long addr;
43 long data;
44} test_cases[] = {
vapiera469a372009-05-26 02:53:28 +000045 { PTRACE_PEEKDATA, .addr = 0 },
46 { PTRACE_PEEKDATA, .addr = 1 },
47 { PTRACE_PEEKDATA, .addr = 2 },
48 { PTRACE_PEEKDATA, .addr = 3 },
49 { PTRACE_PEEKDATA, .addr = -1 },
50 { PTRACE_PEEKDATA, .addr = -2 },
51 { PTRACE_PEEKDATA, .addr = -3 },
52 { PTRACE_PEEKDATA, .addr = -4 },
53
54 { PTRACE_PEEKTEXT, .addr = 0 },
55 { PTRACE_PEEKTEXT, .addr = 1 },
56 { PTRACE_PEEKTEXT, .addr = 2 },
57 { PTRACE_PEEKTEXT, .addr = 3 },
58 { PTRACE_PEEKTEXT, .addr = -1 },
59 { PTRACE_PEEKTEXT, .addr = -2 },
60 { PTRACE_PEEKTEXT, .addr = -3 },
61 { PTRACE_PEEKTEXT, .addr = -4 },
62
63 { PTRACE_PEEKUSER, .addr = SIZEOF_USER + 1 },
64 { PTRACE_PEEKUSER, .addr = SIZEOF_USER + 2 },
65 { PTRACE_PEEKUSER, .addr = SIZEOF_USER + 3 },
66 { PTRACE_PEEKUSER, .addr = SIZEOF_USER + 4 },
67 { PTRACE_PEEKUSER, .addr = -1 },
68 { PTRACE_PEEKUSER, .addr = -2 },
69 { PTRACE_PEEKUSER, .addr = -3 },
70 { PTRACE_PEEKUSER, .addr = -4 },
71
72 { PTRACE_POKEDATA, .addr = 0 },
73 { PTRACE_POKEDATA, .addr = 1 },
74 { PTRACE_POKEDATA, .addr = 2 },
75 { PTRACE_POKEDATA, .addr = 3 },
76 { PTRACE_POKEDATA, .addr = -1 },
77 { PTRACE_POKEDATA, .addr = -2 },
78 { PTRACE_POKEDATA, .addr = -3 },
79 { PTRACE_POKEDATA, .addr = -4 },
80
81 { PTRACE_POKETEXT, .addr = 0 },
82 { PTRACE_POKETEXT, .addr = 1 },
83 { PTRACE_POKETEXT, .addr = 2 },
84 { PTRACE_POKETEXT, .addr = 3 },
85 { PTRACE_POKETEXT, .addr = -1 },
86 { PTRACE_POKETEXT, .addr = -2 },
87 { PTRACE_POKETEXT, .addr = -3 },
88 { PTRACE_POKETEXT, .addr = -4 },
89
90 { PTRACE_POKEUSER, .addr = SIZEOF_USER + 1 },
91 { PTRACE_POKEUSER, .addr = SIZEOF_USER + 2 },
92 { PTRACE_POKEUSER, .addr = SIZEOF_USER + 3 },
93 { PTRACE_POKEUSER, .addr = SIZEOF_USER + 4 },
94 { PTRACE_POKEUSER, .addr = -1 },
95 { PTRACE_POKEUSER, .addr = -2 },
96 { PTRACE_POKEUSER, .addr = -3 },
97 { PTRACE_POKEUSER, .addr = -4 },
98
subrata_modaka6e0aa52008-10-15 14:17:03 +000099#ifdef PTRACE_GETREGS
vapiera469a372009-05-26 02:53:28 +0000100 { PTRACE_GETREGS, .data = 0 },
101 { PTRACE_GETREGS, .data = 1 },
102 { PTRACE_GETREGS, .data = 2 },
103 { PTRACE_GETREGS, .data = 3 },
104 { PTRACE_GETREGS, .data = -1 },
105 { PTRACE_GETREGS, .data = -2 },
106 { PTRACE_GETREGS, .data = -3 },
107 { PTRACE_GETREGS, .data = -4 },
subrata_modaka6e0aa52008-10-15 14:17:03 +0000108#endif
vapiera469a372009-05-26 02:53:28 +0000109
vapier84354092008-09-26 23:01:20 +0000110#ifdef PTRACE_GETFGREGS
vapiera469a372009-05-26 02:53:28 +0000111 { PTRACE_GETFGREGS, .data = 0 },
112 { PTRACE_GETFGREGS, .data = 1 },
113 { PTRACE_GETFGREGS, .data = 2 },
114 { PTRACE_GETFGREGS, .data = 3 },
115 { PTRACE_GETFGREGS, .data = -1 },
116 { PTRACE_GETFGREGS, .data = -2 },
117 { PTRACE_GETFGREGS, .data = -3 },
118 { PTRACE_GETFGREGS, .data = -4 },
vapier84354092008-09-26 23:01:20 +0000119#endif
vapiera469a372009-05-26 02:53:28 +0000120
subrata_modaka6e0aa52008-10-15 14:17:03 +0000121#ifdef PTRACE_SETREGS
vapiera469a372009-05-26 02:53:28 +0000122 { PTRACE_SETREGS, .data = 0 },
123 { PTRACE_SETREGS, .data = 1 },
124 { PTRACE_SETREGS, .data = 2 },
125 { PTRACE_SETREGS, .data = 3 },
126 { PTRACE_SETREGS, .data = -1 },
127 { PTRACE_SETREGS, .data = -2 },
128 { PTRACE_SETREGS, .data = -3 },
129 { PTRACE_SETREGS, .data = -4 },
subrata_modaka6e0aa52008-10-15 14:17:03 +0000130#endif
vapiera469a372009-05-26 02:53:28 +0000131
vapier84354092008-09-26 23:01:20 +0000132#ifdef PTRACE_SETFGREGS
vapiera469a372009-05-26 02:53:28 +0000133 { PTRACE_SETFGREGS, .data = 0 },
134 { PTRACE_SETFGREGS, .data = 1 },
135 { PTRACE_SETFGREGS, .data = 2 },
136 { PTRACE_SETFGREGS, .data = 3 },
137 { PTRACE_SETFGREGS, .data = -1 },
138 { PTRACE_SETFGREGS, .data = -2 },
139 { PTRACE_SETFGREGS, .data = -3 },
140 { PTRACE_SETFGREGS, .data = -4 },
vapier84354092008-09-26 23:01:20 +0000141#endif
vapiera469a372009-05-26 02:53:28 +0000142
143 { PTRACE_GETSIGINFO, .data = 0 },
144 { PTRACE_GETSIGINFO, .data = 1 },
145 { PTRACE_GETSIGINFO, .data = 2 },
146 { PTRACE_GETSIGINFO, .data = 3 },
147 { PTRACE_GETSIGINFO, .data = -1 },
148 { PTRACE_GETSIGINFO, .data = -2 },
149 { PTRACE_GETSIGINFO, .data = -3 },
150 { PTRACE_GETSIGINFO, .data = -4 },
151
152 { PTRACE_SETSIGINFO, .data = 0 },
153 { PTRACE_SETSIGINFO, .data = 1 },
154 { PTRACE_SETSIGINFO, .data = 2 },
155 { PTRACE_SETSIGINFO, .data = 3 },
156 { PTRACE_SETSIGINFO, .data = -1 },
157 { PTRACE_SETSIGINFO, .data = -2 },
158 { PTRACE_SETSIGINFO, .data = -3 },
159 { PTRACE_SETSIGINFO, .data = -4 },
160};
vapier84354092008-09-26 23:01:20 +0000161
162int TST_TOTAL = ARRAY_SIZE(test_cases);
163
164int main(int argc, char *argv[])
165{
166 size_t i;
167 long ret;
168 int saved_errno;
169 char *msg;
170
171 if ((msg = parse_opts(argc, argv, NULL, NULL)))
172 tst_brkm(TBROK, tst_exit, "OPTION PARSING ERROR - %s", msg);
173
174 make_a_baby(argc, argv);
175
176 for (i = 0; i < ARRAY_SIZE(test_cases); ++i) {
177 struct test_case_t *tc = &test_cases[i];
178
179 errno = 0;
vapiera469a372009-05-26 02:53:28 +0000180 ret = ptrace(tc->request, pid, (void *)tc->addr, (void *)tc->data);
vapier84354092008-09-26 23:01:20 +0000181 saved_errno = errno;
182 if (ret != -1)
vapiera469a372009-05-26 02:53:28 +0000183 tst_resm(TFAIL, "ptrace(%s, ..., %p, %p) returned %li instead of -1",
184 strptrace(tc->request), tc->addr, tc->data, ret);
vapier84354092008-09-26 23:01:20 +0000185 else if (saved_errno != EIO && saved_errno != EFAULT)
vapiera469a372009-05-26 02:53:28 +0000186 tst_resm(TFAIL, "ptrace(%s, ..., %p, %p) expected errno EIO or EFAULT; actual: %i (%s)",
187 strptrace(tc->request), tc->addr, tc->data,
188 saved_errno, strerror(saved_errno));
vapier84354092008-09-26 23:01:20 +0000189 else
vapiera469a372009-05-26 02:53:28 +0000190 tst_resm(TPASS, "ptrace(%s, ..., %p, %p) failed as expected",
191 strptrace(tc->request), tc->addr, tc->data);
vapier84354092008-09-26 23:01:20 +0000192 }
193
194 /* hopefully this worked */
195 ptrace(PTRACE_KILL, pid, NULL, NULL);
196
197 tst_exit();
198}