summaryrefslogtreecommitdiff
path: root/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_syntax_errors.tc
blob: b0e6b80ccb01fd0c7ddee2a3f91e71767fba128f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
# description: Kprobe event parser error log check
# requires: kprobe_events error_log

check_error() { # command-with-error-pos-by-^
    ftrace_errlog_check 'trace_kprobe' "$1" 'kprobe_events'
}

if grep -q 'r\[maxactive\]' README; then
check_error 'p^100 vfs_read'		# BAD_MAXACT_TYPE
check_error 'r^1a111 vfs_read'		# BAD_MAXACT
check_error 'r^100000 vfs_read'		# MAXACT_TOO_BIG
fi

check_error 'p ^non_exist_func'		# BAD_PROBE_ADDR (enoent)
check_error 'p ^hoge-fuga'		# BAD_PROBE_ADDR (bad syntax)
check_error 'p ^hoge+1000-1000'		# BAD_PROBE_ADDR (bad syntax)
check_error 'r ^vfs_read+10'		# BAD_RETPROBE
check_error 'p:^/bar vfs_read'		# NO_GROUP_NAME
check_error 'p:^12345678901234567890123456789012345678901234567890123456789012345/bar vfs_read'	# GROUP_TOO_LONG

check_error 'p:^foo.1/bar vfs_read'	# BAD_GROUP_NAME
check_error 'p:^ vfs_read'		# NO_EVENT_NAME
check_error 'p:foo/^12345678901234567890123456789012345678901234567890123456789012345 vfs_read'	# EVENT_TOO_LONG
check_error 'p:foo/^bar.1 vfs_read'	# BAD_EVENT_NAME

check_error 'p vfs_read ^$retval'	# RETVAL_ON_PROBE
check_error 'p vfs_read ^$stack10000'	# BAD_STACK_NUM

if grep -q '$arg<N>' README; then
check_error 'p vfs_read ^$arg10000'	# BAD_ARG_NUM
fi

check_error 'p vfs_read ^$none_var'	# BAD_VAR

check_error 'p vfs_read ^%none_reg'	# BAD_REG_NAME
check_error 'p vfs_read ^@12345678abcde'	# BAD_MEM_ADDR
check_error 'p vfs_read ^@+10'		# FILE_ON_KPROBE

grep -q "imm-value" README && \
check_error 'p vfs_read arg1=\^x'	# BAD_IMM
grep -q "imm-string" README && \
check_error 'p vfs_read arg1=\"abcd^'	# IMMSTR_NO_CLOSE

check_error 'p vfs_read ^+0@0)'		# DEREF_NEED_BRACE
check_error 'p vfs_read ^+0ab1(@0)'	# BAD_DEREF_OFFS
check_error 'p vfs_read +0(+0(@0^)'	# DEREF_OPEN_BRACE

if grep -A1 "fetcharg:" README | grep -q '\$comm' ; then
check_error 'p vfs_read +0(^$comm)'	# COMM_CANT_DEREF
fi

check_error 'p vfs_read ^&1'		# BAD_FETCH_ARG


# We've introduced this limitation with array support
if grep -q ' <type>\\\[<array-size>\\\]' README; then
check_error 'p vfs_read +0(+0(+0(+0(+0(+0(+0(+0(^+0(@0)))))))))'	# TOO_MANY_NESTED
check_error 'p vfs_read +0(@11):u8[10^'		# ARRAY_NO_CLOSE
check_error 'p vfs_read +0(@11):u8[10]^a'	# BAD_ARRAY_SUFFIX
check_error 'p vfs_read +0(@11):u8[^10a]'	# BAD_ARRAY_NUM
check_error 'p vfs_read +0(@11):u8[^256]'	# ARRAY_TOO_BIG
fi

check_error 'p vfs_read @11:^unknown_type'	# BAD_TYPE
check_error 'p vfs_read $stack0:^string'	# BAD_STRING
check_error 'p vfs_read @11:^b10@a/16'		# BAD_BITFIELD

check_error 'p vfs_read ^arg123456789012345678901234567890=@11'	# ARG_NAME_TOO_LOG
check_error 'p vfs_read ^=@11'			# NO_ARG_NAME
check_error 'p vfs_read ^var.1=@11'		# BAD_ARG_NAME
check_error 'p vfs_read var1=@11 ^var1=@12'	# USED_ARG_NAME
check_error 'p vfs_read ^+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(@1234))))))))))))))))))))))))))'	# ARG_TOO_LONG
check_error 'p vfs_read arg1=^'			# NO_ARG_BODY

# instruction boundary check is valid on x86 (at this moment)
case $(uname -m) in
  x86_64|i[3456]86)
    echo 'p vfs_read' > kprobe_events
    if grep -q FTRACE ../kprobes/list ; then
	check_error 'p ^vfs_read+3'		# BAD_INSN_BNDRY (only if function-tracer is enabled)
    fi
    ;;
esac

# multiprobe errors
if grep -q "Create/append/" README && grep -q "imm-value" README; then
echo "p:kprobes/testevent $FUNCTION_FORK" > kprobe_events
check_error '^r:kprobes/testevent do_exit'	# DIFF_PROBE_TYPE

# Explicitly use printf "%s" to not interpret \1
printf "%s" "p:kprobes/testevent $FUNCTION_FORK abcd=\\1" > kprobe_events
check_error "p:kprobes/testevent $FUNCTION_FORK ^bcd=\\1"	# DIFF_ARG_TYPE
check_error "p:kprobes/testevent $FUNCTION_FORK ^abcd=\\1:u8"	# DIFF_ARG_TYPE
check_error "p:kprobes/testevent $FUNCTION_FORK ^abcd=\\\"foo\"" # DIFF_ARG_TYPE
check_error "^p:kprobes/testevent $FUNCTION_FORK abcd=\\1"	# SAME_PROBE
fi

# %return suffix errors
if grep -q "place (kretprobe): .*%return.*" README; then
check_error 'p vfs_read^%hoge'		# BAD_ADDR_SUFFIX
check_error 'p ^vfs_read+10%return'	# BAD_RETPROBE
fi

# BTF arguments errors
if grep -q "<argname>" README; then
check_error 'p vfs_read args=^$arg*'		# BAD_VAR_ARGS
check_error 'p vfs_read +0(^$arg*)'		# BAD_VAR_ARGS
check_error 'p vfs_read $arg* ^$arg*'		# DOUBLE_ARGS
if !grep -q 'kernel return probes support:' README; then
check_error 'r vfs_read ^$arg*'			# NOFENTRY_ARGS
fi
check_error 'p vfs_read+20 ^$arg*'		# NOFENTRY_ARGS
check_error 'p vfs_read ^hoge'			# NO_BTFARG
check_error 'p kfree ^$arg10'			# NO_BTFARG (exceed the number of parameters)
check_error 'r kfree ^$retval'			# NO_RETVAL
if grep -qF "[(structname" README ; then
check_error 'p vfs_read arg1=(task_struct)file^'		# TYPECAST_REQ_FIELD
check_error 'p vfs_read arg1=(a)((b)((c)((d)((e)((f)((g)((h)(^(i)file->i)->h)->g)->f)->e)->d)->c)->b)->a'	# TOO_MANY_NESTED
check_error 'p vfs_read arg1=(task_struct,^in_execve)file->comm'	# TYPECAST_NOT_ALIGNED
check_error 'p vfs_read arg1=(task_struct,^foo_bar)file->pid'	# NO_BTF_FIELD
check_error 'p vfs_read arg1=(^task_struct1234)file->pid'		# NO_PTR_STRCT
check_error 'p vfs_read arg1=(task_struct,se^->group_node)file->comm'	# TYPECAST_BAD_ARROW
check_error 'p vfs_read arg1=(task_struct,^->pid)file->comm'	# NO_BTF_FIELD
check_error 'p vfs_read arg1=(task_struct,^.pid)file->comm'	# NO_BTF_FIELD
check_error 'p vfs_read arg1=(task_struct,^.)file->comm'	# NO_BTF_FIELD
check_error 'p vfs_read arg1=(task_struct)^@symbol+10->comm'	# TYPECAST_SYM_OFFSET
fi
else
check_error 'p vfs_read ^$arg*'			# NOSUP_BTFARG
fi

exit 0