2 * check out-of-bound/unaligned addresses given to
3 * - {PEEK,POKE}{DATA,TEXT,USER}
7 * Copyright (c) 2008 Analog Devices Inc.
9 * Licensed under the GPL-2 or later
17 #include <sys/ptrace.h>
18 #include <linux/ptrace.h>
19 #include <asm/ptrace.h>
23 #include "spawn_ptrace_child.c"
25 char *TCID
= "ptrace06";
28 enum __ptrace_request request
;
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 },
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 },
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
[])
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
];
152 ret
= ptrace(tc
->request
, pid
, (void *)tc
->addr
, (void *)tc
->data
);
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
));
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
);