@@ -53,12 +53,23 @@ type observerKprobeSensor struct {
5353 name string
5454}
5555
56+ type fmodRetProgram struct {
57+ name string
58+ }
59+
5660func init () {
5761 kprobe := & observerKprobeSensor {
5862 name : "kprobe sensor" ,
5963 }
64+
65+ fmodRet := & fmodRetProgram {
66+ name : "fmod_ret program" ,
67+ }
68+
6069 sensors .RegisterProbeType ("generic_kprobe" , kprobe )
6170 observer .RegisterEventHandlerAtInit (ops .MSG_OP_GENERIC_KPROBE , handleGenericKprobe )
71+
72+ sensors .RegisterProbeType ("generic_fmod_ret" , fmodRet )
6273}
6374
6475type kprobeSelectors struct {
@@ -1073,11 +1084,25 @@ func createKprobeSensorFromEntry(polInfo *policyInfo, kprobeEntry *genericKprobe
10731084 maps = append (maps , program .MapUser (cgtracker .MapName , load ))
10741085 }
10751086
1076- overrideTasksMap := program .MapBuilderProgram ("override_tasks" , load )
1077- if has .override {
1078- overrideTasksMap .SetMaxEntries (overrideMapMaxEntries )
1087+ if load .Override && load .OverrideFmodRet {
1088+ // setup fmodret program and its input
1089+ fmodRetProg , fmodRetMap := getFmodRetProg (kprobeEntry .funcName )
1090+ progs = append (progs , fmodRetProg )
1091+ maps = append (maps , fmodRetMap )
1092+
1093+ // setup the output of kprobe
1094+ overrideTasksMap := program .MapBuilder ("override_tasks" , load )
1095+ overrideTasksMap .PinPath = path .Join ("fmod_ret/" , kprobeEntry .funcName , "override_tasks" )
1096+
1097+ maps = append (maps , overrideTasksMap )
1098+ } else {
1099+ // kprobe override
1100+ overrideTasksMap := program .MapBuilderProgram ("override_tasks" , load )
1101+ if has .override {
1102+ overrideTasksMap .SetMaxEntries (overrideMapMaxEntries )
1103+ }
1104+ maps = append (maps , overrideTasksMap )
10791105 }
1080- maps = append (maps , overrideTasksMap )
10811106
10821107 maps = append (maps , polInfo .policyConfMap (load ), polInfo .policyStatsMap (load ))
10831108
@@ -1234,6 +1259,21 @@ func loadMultiKprobeSensor(ids []idtable.EntryID, bpfDir string, load *program.P
12341259 return nil
12351260}
12361261
1262+ func loadGenericFmodRetProgram (bpfDir string , load * program.Program , maps []* program.Map , verbose int ) error {
1263+ if load .LoadState .IsLoaded () {
1264+ logger .GetLogger ().Info (fmt .Sprintf ("The generic fmodify return program on %s has been loaded" , load .Attach ))
1265+ return nil
1266+ }
1267+
1268+ logger .GetLogger ().Info ("loading generic fmod ret program" , "prog" , load )
1269+
1270+ unload := func () {
1271+ deleteFmodRetProg (load .Attach )
1272+ }
1273+
1274+ return program .LoadFmodRetProgram (bpfDir , load , maps , "generic_fmodret_override" , verbose , unload )
1275+ }
1276+
12371277func loadGenericKprobeSensor (bpfDir string , load * program.Program , maps []* program.Map , verbose int ) error {
12381278 if id , ok := load .LoaderData .(idtable.EntryID ); ok {
12391279 return loadSingleKprobeSensor (id , bpfDir , load , maps , verbose )
@@ -1461,3 +1501,7 @@ func retprobeMerge(prev pendingEvent, curr pendingEvent) *tracing.MsgGenericKpro
14611501func (k * observerKprobeSensor ) LoadProbe (args sensors.LoadProbeArgs ) error {
14621502 return loadGenericKprobeSensor (args .BPFDir , args .Load , args .Maps , args .Verbose )
14631503}
1504+
1505+ func (k * fmodRetProgram ) LoadProbe (args sensors.LoadProbeArgs ) error {
1506+ return loadGenericFmodRetProgram (args .BPFDir , args .Load , args .Maps , args .Verbose )
1507+ }
0 commit comments