@@ -72,41 +72,43 @@ static __always_inline void *get_thread_state(void *tls_base, PidData *pidData)
72
72
void * thread_state ;
73
73
int key ;
74
74
75
- bpf_probe_read (& key , sizeof (key ), (void * )(long )pidData -> tls_key_addr );
76
- bpf_probe_read (& thread_state , sizeof (thread_state ),
77
- tls_base + 0x310 + key * 0x10 + 0x08 );
75
+ bpf_probe_read_user (& key , sizeof (key ), (void * )(long )pidData -> tls_key_addr );
76
+ bpf_probe_read_user (& thread_state , sizeof (thread_state ),
77
+ tls_base + 0x310 + key * 0x10 + 0x08 );
78
78
return thread_state ;
79
79
}
80
80
81
81
static __always_inline bool get_frame_data (void * frame_ptr , PidData * pidData ,
82
82
FrameData * frame , Symbol * symbol )
83
83
{
84
84
// read data from PyFrameObject
85
- bpf_probe_read (& frame -> f_back ,
86
- sizeof (frame -> f_back ),
87
- frame_ptr + pidData -> offsets .PyFrameObject_back );
88
- bpf_probe_read (& frame -> f_code ,
89
- sizeof (frame -> f_code ),
90
- frame_ptr + pidData -> offsets .PyFrameObject_code );
85
+ bpf_probe_read_user (& frame -> f_back ,
86
+ sizeof (frame -> f_back ),
87
+ frame_ptr + pidData -> offsets .PyFrameObject_back );
88
+ bpf_probe_read_user (& frame -> f_code ,
89
+ sizeof (frame -> f_code ),
90
+ frame_ptr + pidData -> offsets .PyFrameObject_code );
91
91
92
92
// read data from PyCodeObject
93
93
if (!frame -> f_code )
94
94
return false;
95
- bpf_probe_read (& frame -> co_filename ,
96
- sizeof (frame -> co_filename ),
97
- frame -> f_code + pidData -> offsets .PyCodeObject_filename );
98
- bpf_probe_read (& frame -> co_name ,
99
- sizeof (frame -> co_name ),
100
- frame -> f_code + pidData -> offsets .PyCodeObject_name );
95
+ bpf_probe_read_user (& frame -> co_filename ,
96
+ sizeof (frame -> co_filename ),
97
+ frame -> f_code + pidData -> offsets .PyCodeObject_filename );
98
+ bpf_probe_read_user (& frame -> co_name ,
99
+ sizeof (frame -> co_name ),
100
+ frame -> f_code + pidData -> offsets .PyCodeObject_name );
101
101
// read actual names into symbol
102
102
if (frame -> co_filename )
103
- bpf_probe_read_str (& symbol -> file ,
104
- sizeof (symbol -> file ),
105
- frame -> co_filename + pidData -> offsets .String_data );
103
+ bpf_probe_read_user_str (& symbol -> file ,
104
+ sizeof (symbol -> file ),
105
+ frame -> co_filename +
106
+ pidData -> offsets .String_data );
106
107
if (frame -> co_name )
107
- bpf_probe_read_str (& symbol -> name ,
108
- sizeof (symbol -> name ),
109
- frame -> co_name + pidData -> offsets .String_data );
108
+ bpf_probe_read_user_str (& symbol -> name ,
109
+ sizeof (symbol -> name ),
110
+ frame -> co_name +
111
+ pidData -> offsets .String_data );
110
112
return true;
111
113
}
112
114
@@ -174,9 +176,9 @@ static __always_inline int __on_event(struct pt_regs *ctx)
174
176
event -> kernel_stack_id = bpf_get_stackid (ctx , & stackmap , 0 );
175
177
176
178
void * thread_state_current = (void * )0 ;
177
- bpf_probe_read (& thread_state_current ,
178
- sizeof (thread_state_current ),
179
- (void * )(long )pidData -> current_state_addr );
179
+ bpf_probe_read_user (& thread_state_current ,
180
+ sizeof (thread_state_current ),
181
+ (void * )(long )pidData -> current_state_addr );
180
182
181
183
struct task_struct * task = (struct task_struct * )bpf_get_current_task ();
182
184
void * tls_base = (void * )task ;
@@ -188,11 +190,13 @@ static __always_inline int __on_event(struct pt_regs *ctx)
188
190
if (pidData -> use_tls ) {
189
191
uint64_t pthread_created ;
190
192
uint64_t pthread_self ;
191
- bpf_probe_read (& pthread_self , sizeof (pthread_self ), tls_base + 0x10 );
193
+ bpf_probe_read_user (& pthread_self , sizeof (pthread_self ),
194
+ tls_base + 0x10 );
192
195
193
- bpf_probe_read (& pthread_created ,
194
- sizeof (pthread_created ),
195
- thread_state + pidData -> offsets .PyThreadState_thread );
196
+ bpf_probe_read_user (& pthread_created ,
197
+ sizeof (pthread_created ),
198
+ thread_state +
199
+ pidData -> offsets .PyThreadState_thread );
196
200
event -> pthread_match = pthread_created == pthread_self ;
197
201
} else {
198
202
event -> pthread_match = 1 ;
@@ -204,9 +208,10 @@ static __always_inline int __on_event(struct pt_regs *ctx)
204
208
Symbol sym = {};
205
209
int cur_cpu = bpf_get_smp_processor_id ();
206
210
207
- bpf_probe_read (& frame_ptr ,
208
- sizeof (frame_ptr ),
209
- thread_state + pidData -> offsets .PyThreadState_frame );
211
+ bpf_probe_read_user (& frame_ptr ,
212
+ sizeof (frame_ptr ),
213
+ thread_state +
214
+ pidData -> offsets .PyThreadState_frame );
210
215
211
216
int32_t * symbol_counter = bpf_map_lookup_elem (& symbolmap , & sym );
212
217
if (symbol_counter == NULL )
0 commit comments