Skip to content

Commit 0831abb

Browse files
bpf: unify resolve null dereference detection
The previous commit gave us some additional instruction budget that allows us support null dereference detection on 4.19. Signed-off-by: Andy Strohman <[email protected]>
1 parent fb53eff commit 0831abb

File tree

5 files changed

+29
-81
lines changed

5 files changed

+29
-81
lines changed

bpf/process/generic_calls.h

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -221,13 +221,9 @@ FUNC_INLINE bool is_read_arg_1(long type)
221221

222222
FUNC_INLINE long write_arg_status(struct msg_generic_kprobe *e, unsigned long offset, __u32 status)
223223
{
224-
#ifdef __LARGE_BPF_PROG
225224
char *args = args_off(e, offset);
226225
*(__u32 *)args = status;
227226
return (offset + sizeof(__u32)) & 16383;
228-
#else
229-
return offset;
230-
#endif
231227
}
232228

233229
FUNC_INLINE long
@@ -340,11 +336,7 @@ __read_arg_1(void *ctx, int type, long orig_off, unsigned long arg, int argm, ch
340336
size = 0;
341337
break;
342338
}
343-
#ifdef __LARGE_BPF_PROG
344339
return size + sizeof(__u32);
345-
#else
346-
return size;
347-
#endif
348340
}
349341

350342
FUNC_INLINE long
@@ -422,11 +414,7 @@ __read_arg_2(void *ctx, int type, long orig_off, unsigned long arg, int argm, ch
422414
size = 0;
423415
break;
424416
}
425-
#ifdef __LARGE_BPF_PROG
426417
return size + sizeof(__u32);
427-
#else
428-
return size;
429-
#endif
430418
}
431419

432420
/**
@@ -445,12 +433,8 @@ __read_arg_2(void *ctx, int type, long orig_off, unsigned long arg, int argm, ch
445433
FUNC_INLINE long
446434
read_arg(void *ctx, int index, int type, long orig_off, unsigned long arg, int argm, int process)
447435
{
448-
#ifdef __LARGE_BPF_PROG
449436
// min size of type plus the size of the header which indicates arg read status
450437
size_t min_size = type_to_min_size(type, argm) + sizeof(__u32);
451-
#else
452-
size_t min_size = type_to_min_size(type, argm);
453-
#endif
454438

455439
struct msg_generic_kprobe *e;
456440
char *args;
@@ -467,26 +451,18 @@ read_arg(void *ctx, int index, int type, long orig_off, unsigned long arg, int a
467451

468452
orig_off &= 16383;
469453

470-
#ifdef __LARGE_BPF_PROG
471454
index &= MAX_SELECTORS_MASK;
472455
orig_off = write_arg_status(e, orig_off, e->arg_error_status[index]);
473456
/* Cache args offset for filter use later */
474457
e->argsoff[index] = orig_off;
475458
if (e->arg_error_status[index])
476459
return sizeof(__u32);
477-
#else
478-
/* Cache args offset for filter use later */
479-
e->argsoff[index & MAX_SELECTORS_MASK] = orig_off;
480-
#endif
460+
481461
args = args_off(e, orig_off);
482462

483463
path_arg = get_path(type, arg, &path_buf);
484464
if (path_arg)
485-
#ifdef __LARGE_BPF_PROG
486465
return copy_path(args, path_arg) + sizeof(__u32);
487-
#else
488-
return copy_path(args, path_arg);
489-
#endif
490466
/*
491467
* Separate argument processing based on the process const
492468
* for 4.19 kernels..
@@ -629,9 +605,7 @@ FUNC_INLINE long generic_read_arg(void *ctx, int index, long off, struct bpf_map
629605
#endif
630606
#endif
631607

632-
#ifdef __LARGE_BPF_PROG
633608
e->arg_error_status[index] = 0;
634-
#endif
635609

636610
#if defined(GENERIC_TRACEPOINT) || defined(GENERIC_USDT)
637611
a = (&e->a0)[index];
@@ -1351,15 +1325,11 @@ FUNC_INLINE int generic_retprobe(void *ctx, struct bpf_map_def *calls, unsigned
13511325

13521326
switch (do_copy) {
13531327
case char_buf:
1354-
#ifdef __LARGE_BPF_PROG
13551328
size = write_arg_status(e, size, 0);
1356-
#endif
13571329
size += __copy_char_buf(ctx, size, info.ptr, ret, false, e);
13581330
break;
13591331
case char_iovec:
1360-
#ifdef __LARGE_BPF_PROG
13611332
size = write_arg_status(e, size, 0);
1362-
#endif
13631333
size += __copy_char_iovec(size, info.ptr, info.cnt, ret, e);
13641334
break;
13651335
default:

bpf/process/generic_path.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -198,24 +198,16 @@ FUNC_INLINE long generic_path_offload(void *ctx, long ty, unsigned long arg,
198198
if (!buffer)
199199
return 0;
200200

201-
#ifdef __LARGE_BPF_PROG
202201
index &= MAX_SELECTORS_MASK;
203202

204203
orig_off = write_arg_status(e, orig_off, e->arg_error_status[index]);
205204

206205
e->argsoff[index] = orig_off;
207206
if (e->arg_error_status[index])
208207
return sizeof(__u32);
209-
#else
210-
e->argsoff[index & MAX_SELECTORS_MASK] = orig_off;
211-
#endif
212208
args = args_off(e, orig_off);
213209
buf = get_buf(buffer, gp->off);
214-
#ifdef __LARGE_BPF_PROG
215210
return store_path(args, buf, gp->path, MAX_BUF_LEN - gp->off - 1, 0) + sizeof(__u32);
216-
#else
217-
return store_path(args, buf, gp->path, MAX_BUF_LEN - gp->off - 1, 0);
218-
#endif
219211
}
220212

221213
FUNC_INLINE bool should_offload_path(long type)

bpf/process/types/basic.h

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2105,10 +2105,9 @@ selector_arg_offset(void *ctx, struct bpf_map_def *tailcalls,
21052105
if (index > 5)
21062106
return 0;
21072107

2108-
#ifdef __LARGE_BPF_PROG
21092108
if (e->arg_error_status[index])
21102109
return 0;
2111-
#endif
2110+
21122111
args = get_arg(e, index);
21132112
if (!filter_arg(e, filter, args, process))
21142113
return 0;
@@ -2329,17 +2328,9 @@ rate_limit(__u64 ratelimit_interval, __u64 ratelimit_scope, struct msg_generic_k
23292328
if (i < MAX_POSSIBLE_ARGS - 1 && arg_idx(i + 1) != -1)
23302329
arg_size = e->argsoff[i + 1] - e->argsoff[i];
23312330
else
2332-
#ifdef __LARGE_BPF_PROG
23332331
arg_size = e->common.size - e->argsoff[i] + sizeof(__u32);
2334-
#else
2335-
arg_size = e->common.size - e->argsoff[i];
2336-
#endif
23372332
if (arg_size > 0) {
2338-
#ifdef __LARGE_BPF_PROG
23392333
key_index = (e->argsoff[i] - sizeof(__u32)) & 16383;
2340-
#else
2341-
key_index = e->argsoff[i] & 16383;
2342-
#endif
23432334
if (arg_size > KEY_BYTES_PER_ARG)
23442335
arg_size = KEY_BYTES_PER_ARG;
23452336
asm volatile("%[arg_size] &= 0x3f;\n" // ensure this mask is greater than KEY_BYTES_PER_ARG

pkg/sensors/tracing/args_linux.go

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
"github.com/cilium/tetragon/pkg/api/dataapi"
1414
processapi "github.com/cilium/tetragon/pkg/api/processapi"
1515
api "github.com/cilium/tetragon/pkg/api/tracingapi"
16-
"github.com/cilium/tetragon/pkg/config"
1716
gt "github.com/cilium/tetragon/pkg/generictypes"
1817
"github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/v1alpha1"
1918
"github.com/cilium/tetragon/pkg/logger"
@@ -91,24 +90,22 @@ func getArg(r *bytes.Reader, a argPrinter) api.MsgGenericKprobeArg {
9190
var err error
9291
var status uint32
9392

94-
if config.EnableLargeProgs() {
95-
err = binary.Read(r, binary.LittleEndian, &status)
96-
if err != nil {
97-
logger.GetLogger().Warn("Status header error", "arg.usertype", gt.GenericUserTypeToString(a.userType), logfields.Error, err)
98-
return nil
99-
}
93+
err = binary.Read(r, binary.LittleEndian, &status)
94+
if err != nil {
95+
logger.GetLogger().Warn("Status header error", "arg.usertype", gt.GenericUserTypeToString(a.userType), logfields.Error, err)
96+
return nil
97+
}
10098

101-
if status != 0 {
102-
var arg api.MsgGenericKprobeArgError
103-
ptr_name := "pointer"
104-
if len(a.BTFPtrNames[status-1]) != 0 {
105-
ptr_name = a.BTFPtrNames[status-1]
106-
}
107-
arg.Message = "failed to dereference " + ptr_name
108-
arg.Index = uint64(a.index)
109-
arg.Label = a.label
110-
return arg
99+
if status != 0 {
100+
var arg api.MsgGenericKprobeArgError
101+
ptr_name := "pointer"
102+
if len(a.BTFPtrNames[status-1]) != 0 {
103+
ptr_name = a.BTFPtrNames[status-1]
111104
}
105+
arg.Message = "failed to dereference " + ptr_name
106+
arg.Index = uint64(a.index)
107+
arg.Label = a.label
108+
return arg
112109
}
113110

114111
switch a.ty {

pkg/sensors/tracing/generictracepoint.go

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -862,24 +862,22 @@ func handleMsgGenericTracepoint(
862862
continue
863863
}
864864

865-
if config.EnableLargeProgs() {
866-
err := binary.Read(r, binary.LittleEndian, &status)
865+
err := binary.Read(r, binary.LittleEndian, &status)
867866

868-
if err != nil {
869-
logger.GetLogger().Warn(fmt.Sprintf("Arg status size type error sizeof %d", m.Common.Size), logfields.Error, err)
870-
break
871-
}
867+
if err != nil {
868+
logger.GetLogger().Warn(fmt.Sprintf("Arg status size type error sizeof %d", m.Common.Size), logfields.Error, err)
869+
break
870+
}
872871

873-
if status != 0 {
874-
var arg tracingapi.MsgGenericKprobeArgError
875-
ptr_name := "pointer"
876-
if len(tp.args[idx].btfPtrNames[status-1]) != 0 {
877-
ptr_name = tp.args[idx].btfPtrNames[status-1]
878-
}
879-
arg.Message = "failed to dereference " + ptr_name
880-
unix.Args = append(unix.Args, arg)
881-
continue
872+
if status != 0 {
873+
var arg tracingapi.MsgGenericKprobeArgError
874+
ptr_name := "pointer"
875+
if len(tp.args[idx].btfPtrNames[status-1]) != 0 {
876+
ptr_name = tp.args[idx].btfPtrNames[status-1]
882877
}
878+
arg.Message = "failed to dereference " + ptr_name
879+
unix.Args = append(unix.Args, arg)
880+
continue
883881
}
884882

885883
switch out.genericTypeId {

0 commit comments

Comments
 (0)