@@ -250,6 +250,7 @@ void proc_coredump_connector(struct task_struct *task)
250
250
{
251
251
struct cn_msg * msg ;
252
252
struct proc_event * ev ;
253
+ struct task_struct * parent ;
253
254
__u8 buffer [CN_PROC_MSG_SIZE ] __aligned (8 );
254
255
255
256
if (atomic_read (& proc_event_num_listeners ) < 1 )
@@ -262,8 +263,14 @@ void proc_coredump_connector(struct task_struct *task)
262
263
ev -> what = PROC_EVENT_COREDUMP ;
263
264
ev -> event_data .coredump .process_pid = task -> pid ;
264
265
ev -> event_data .coredump .process_tgid = task -> tgid ;
265
- ev -> event_data .coredump .parent_pid = task -> real_parent -> pid ;
266
- ev -> event_data .coredump .parent_tgid = task -> real_parent -> tgid ;
266
+
267
+ rcu_read_lock ();
268
+ if (pid_alive (task )) {
269
+ parent = rcu_dereference (task -> real_parent );
270
+ ev -> event_data .coredump .parent_pid = parent -> pid ;
271
+ ev -> event_data .coredump .parent_tgid = parent -> tgid ;
272
+ }
273
+ rcu_read_unlock ();
267
274
268
275
memcpy (& msg -> id , & cn_proc_event_id , sizeof (msg -> id ));
269
276
msg -> ack = 0 ; /* not used */
@@ -276,6 +283,7 @@ void proc_exit_connector(struct task_struct *task)
276
283
{
277
284
struct cn_msg * msg ;
278
285
struct proc_event * ev ;
286
+ struct task_struct * parent ;
279
287
__u8 buffer [CN_PROC_MSG_SIZE ] __aligned (8 );
280
288
281
289
if (atomic_read (& proc_event_num_listeners ) < 1 )
@@ -290,8 +298,14 @@ void proc_exit_connector(struct task_struct *task)
290
298
ev -> event_data .exit .process_tgid = task -> tgid ;
291
299
ev -> event_data .exit .exit_code = task -> exit_code ;
292
300
ev -> event_data .exit .exit_signal = task -> exit_signal ;
293
- ev -> event_data .exit .parent_pid = task -> real_parent -> pid ;
294
- ev -> event_data .exit .parent_tgid = task -> real_parent -> tgid ;
301
+
302
+ rcu_read_lock ();
303
+ if (pid_alive (task )) {
304
+ parent = rcu_dereference (task -> real_parent );
305
+ ev -> event_data .exit .parent_pid = parent -> pid ;
306
+ ev -> event_data .exit .parent_tgid = parent -> tgid ;
307
+ }
308
+ rcu_read_unlock ();
295
309
296
310
memcpy (& msg -> id , & cn_proc_event_id , sizeof (msg -> id ));
297
311
msg -> ack = 0 ; /* not used */
0 commit comments