Skip to content

Commit 36afafa

Browse files
tetragon: add negative resolve argsMatch test
When a pointer to a BTF struct is NULL, every type of matchArgs selector should fail to match, because the argument was not really resolved. Signed-off-by: Andy Strohman <[email protected]>
1 parent f89a4f1 commit 36afafa

File tree

2 files changed

+63
-23
lines changed

2 files changed

+63
-23
lines changed

contrib/tester-progs/uprobe-resolve.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ struct mystruct {
2222
void usage(char *argv0)
2323
{
2424
fprintf(stderr, "Usage: %s <field> <val>\n", argv0);
25-
fprintf(stderr, "field can be one of: v8, v16, v32, v64, sub.v32\n");
25+
fprintf(stderr, "field can be one of: v8, v16, v32, v64, sub.v32, null\n");
2626
}
2727

2828
// without noinline, the symbol is found, but no event fires
2929
__attribute__((noinline)) int func(int ret, struct mystruct *ms) {
30+
if (ms == NULL)
31+
return ret;
3032
// without doing something with ms, all the resolved args have
3133
// value 0, presumably due to optimization
3234
printf("v64:%lu\n", ms->v64);
@@ -58,6 +60,8 @@ int main(int argc, char *argv[])
5860
s.v64 = val;
5961
} else if (!strcmp(field, "sub.v32")) {
6062
s.sub.v32 = val;
63+
} else if (!strcmp(field, "null")) {
64+
return func(0, NULL);
6165
} else {
6266
usage(argv[0]);
6367
exit(1);

pkg/sensors/tracing/uprobe_amd64_test.go

Lines changed: 58 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,25 @@ spec:
157157
require.NoError(t, err)
158158
}
159159

160+
type TestInvocation struct {
161+
specTy string
162+
filterVal int
163+
field string
164+
kpArgs []*ec.KprobeArgumentChecker
165+
}
166+
167+
func get_checker(ti TestInvocation, uprobe string) *ec.ProcessUprobeChecker {
168+
return ec.NewProcessUprobeChecker("uprobe-resolve").
169+
WithProcess(ec.NewProcessChecker().
170+
WithBinary(sm.Full(uprobe)).
171+
WithArguments(
172+
sm.Full(ti.field + " " + strconv.Itoa(ti.filterVal)),
173+
),
174+
).WithArgs(ec.NewKprobeArgumentListMatcher().
175+
WithOperator(lc.Ordered).
176+
WithValues(ti.kpArgs...))
177+
}
178+
160179
func TestUprobeResolve(t *testing.T) {
161180
if !config.EnableLargeProgs() || !bpf.HasUprobeRefCtrOffset() {
162181
t.Skip("Need 5.3 or newer kernel for uprobe ref_ctr_off support for this test.")
@@ -169,33 +188,39 @@ func TestUprobeResolve(t *testing.T) {
169188
uprobe := testutils.RepoRootPath("contrib/tester-progs/uprobe-resolve")
170189
uprobeBtf := testutils.RepoRootPath("contrib/tester-progs/uprobe-resolve.btf")
171190

172-
tt := []struct {
173-
specTy string
174-
filterVal int
175-
returnVal int
176-
field string
177-
kpArgs []*ec.KprobeArgumentChecker
178-
}{
179-
{"uint64", 10, 120, "v64", []*ec.KprobeArgumentChecker{
191+
tt := []TestInvocation{
192+
{"uint64", 10, "v64", []*ec.KprobeArgumentChecker{
180193
ec.NewKprobeArgumentChecker().WithIntArg(0),
181194
ec.NewKprobeArgumentChecker().WithSizeArg(10), // uint64(10)
182195
ec.NewKprobeArgumentChecker().WithUintArg(0),
183196
ec.NewKprobeArgumentChecker().WithUintArg(0),
197+
ec.NewKprobeArgumentChecker().WithUintArg(0),
184198
}},
185-
{"uint32", 11, 130, "v32", []*ec.KprobeArgumentChecker{
199+
{"uint32", 11, "v32", []*ec.KprobeArgumentChecker{
186200
ec.NewKprobeArgumentChecker().WithIntArg(0),
187201
ec.NewKprobeArgumentChecker().WithSizeArg(0),
188202
ec.NewKprobeArgumentChecker().WithUintArg(11), // uint32(11)
189203
ec.NewKprobeArgumentChecker().WithUintArg(0),
204+
ec.NewKprobeArgumentChecker().WithUintArg(0),
190205
}},
191-
{"uint32", 12, 140, "sub.v32", []*ec.KprobeArgumentChecker{
206+
{"uint32", 12, "sub.v32", []*ec.KprobeArgumentChecker{
192207
ec.NewKprobeArgumentChecker().WithIntArg(0),
193208
ec.NewKprobeArgumentChecker().WithSizeArg(0),
194209
ec.NewKprobeArgumentChecker().WithUintArg(0),
195210
ec.NewKprobeArgumentChecker().WithUintArg(12), // uint32(12)
211+
ec.NewKprobeArgumentChecker().WithUintArg(0),
196212
}},
197213
}
198214

215+
/* filterVal is ignored by uprobe-resolve "null" type mode */
216+
negative_tests := []TestInvocation{{"uint8", 7, "null", []*ec.KprobeArgumentChecker{
217+
ec.NewKprobeArgumentChecker().WithIntArg(0),
218+
ec.NewKprobeArgumentChecker().WithSizeArg(0),
219+
ec.NewKprobeArgumentChecker().WithUintArg(0),
220+
ec.NewKprobeArgumentChecker().WithUintArg(0),
221+
ec.NewKprobeArgumentChecker().WithUintArg(0),
222+
}}}
223+
199224
uprobeHook := `
200225
apiVersion: cilium.io/v1alpha1
201226
kind: TracingPolicy
@@ -222,6 +247,17 @@ spec:
222247
type: "` + tt[2].specTy + `"
223248
btfType: "mystruct"
224249
resolve: "` + tt[2].field + `"
250+
- index: 1
251+
type: "uint8"
252+
btfType: "mystruct"
253+
resolve: "sub.v8"
254+
selectors:
255+
- matchArgs:
256+
- args: [4]
257+
operator: "Equal"
258+
values:
259+
- "0"
260+
225261
`
226262

227263
uprobeConfigHook := []byte(uprobeHook)
@@ -231,16 +267,13 @@ spec:
231267
}
232268

233269
var checkers []ec.EventChecker
234-
for i := range tt {
235-
checkers = append(checkers, ec.NewProcessUprobeChecker("uprobe-resolve").
236-
WithProcess(ec.NewProcessChecker().
237-
WithBinary(sm.Full(uprobe)).
238-
WithArguments(
239-
sm.Full(tt[i].field+" "+strconv.Itoa(tt[i].filterVal)),
240-
),
241-
).WithArgs(ec.NewKprobeArgumentListMatcher().
242-
WithOperator(lc.Ordered).
243-
WithValues(tt[i].kpArgs...)))
270+
for _, ti := range tt {
271+
checkers = append(checkers, get_checker(ti, uprobe))
272+
}
273+
274+
var negative_checkers []ec.EventChecker
275+
for _, ti := range negative_tests {
276+
negative_checkers = append(negative_checkers, get_checker(ti, uprobe))
244277
}
245278

246279
var doneWG, readyWG sync.WaitGroup
@@ -256,12 +289,15 @@ spec:
256289
observertesthelper.LoopEvents(ctx, t, &doneWG, &readyWG, obs)
257290
readyWG.Wait()
258291

259-
for i := range tt {
260-
cmd := exec.Command(uprobe, tt[i].field, strconv.Itoa(tt[i].filterVal))
292+
for _, ti := range append(tt, negative_tests...) {
293+
cmd := exec.Command(uprobe, ti.field, strconv.Itoa(ti.filterVal))
261294
cmdErr := testutils.RunCmdAndLogOutput(t, cmd)
262295
require.NoError(t, cmdErr)
263296
}
264297

265298
err = jsonchecker.JsonTestCheck(t, ec.NewUnorderedEventChecker(checkers...))
266299
require.NoError(t, err)
300+
301+
err = jsonchecker.JsonTestCheckExpect(t, ec.NewUnorderedEventChecker(negative_checkers...), true)
302+
require.NoError(t, err)
267303
}

0 commit comments

Comments
 (0)