Message ID | 20210906185005.3130298-1-john@metanate.com (mailing list archive) |
---|---|
State | Accepted |
Commit | cadd1a769f95d12d62a25488caab4578bd83ee9a |
Headers | show |
Series | kernel-shark: Handle traces with sched_switch and no sched_waking | expand |
On 6.09.21 г. 21:50, John Keeping wrote: > plugin_sched_init_context() is careful to make the sched_waking (or > sched_wakeup{,_new}) event optional but the initializer blindly > dereferences plugin_ctx->sched_waking_event which is null if no waking > event is found. > > Add the necessary checks to avoid segfaults when (de)initializing the > plugin. > Very well spotted. Thanks a lot! Yordan > Signed-off-by: John Keeping <john@metanate.com> > --- > src/plugins/sched_events.c | 16 ++++++++++------ > 1 file changed, 10 insertions(+), 6 deletions(-) > > diff --git a/src/plugins/sched_events.c b/src/plugins/sched_events.c > index 83c2520..198ed49 100644 > --- a/src/plugins/sched_events.c > +++ b/src/plugins/sched_events.c > @@ -193,9 +193,11 @@ int KSHARK_PLOT_PLUGIN_INITIALIZER(struct kshark_data_stream *stream) > plugin_ctx->sched_switch_event->id, > plugin_sched_swith_action); > > - kshark_register_event_handler(stream, > - plugin_ctx->sched_waking_event->id, > - plugin_sched_wakeup_action); > + if (plugin_ctx->sched_waking_event) { > + kshark_register_event_handler(stream, > + plugin_ctx->sched_waking_event->id, > + plugin_sched_wakeup_action); > + } > > kshark_register_draw_handler(stream, plugin_draw); > > @@ -213,9 +215,11 @@ int KSHARK_PLOT_PLUGIN_DEINITIALIZER(struct kshark_data_stream *stream) > plugin_ctx->sched_switch_event->id, > plugin_sched_swith_action); > > - kshark_unregister_event_handler(stream, > - plugin_ctx->sched_waking_event->id, > - plugin_sched_wakeup_action); > + if (plugin_ctx->sched_waking_event) { > + kshark_unregister_event_handler(stream, > + plugin_ctx->sched_waking_event->id, > + plugin_sched_wakeup_action); > + } > > kshark_unregister_draw_handler(stream, plugin_draw); > >
diff --git a/src/plugins/sched_events.c b/src/plugins/sched_events.c index 83c2520..198ed49 100644 --- a/src/plugins/sched_events.c +++ b/src/plugins/sched_events.c @@ -193,9 +193,11 @@ int KSHARK_PLOT_PLUGIN_INITIALIZER(struct kshark_data_stream *stream) plugin_ctx->sched_switch_event->id, plugin_sched_swith_action); - kshark_register_event_handler(stream, - plugin_ctx->sched_waking_event->id, - plugin_sched_wakeup_action); + if (plugin_ctx->sched_waking_event) { + kshark_register_event_handler(stream, + plugin_ctx->sched_waking_event->id, + plugin_sched_wakeup_action); + } kshark_register_draw_handler(stream, plugin_draw); @@ -213,9 +215,11 @@ int KSHARK_PLOT_PLUGIN_DEINITIALIZER(struct kshark_data_stream *stream) plugin_ctx->sched_switch_event->id, plugin_sched_swith_action); - kshark_unregister_event_handler(stream, - plugin_ctx->sched_waking_event->id, - plugin_sched_wakeup_action); + if (plugin_ctx->sched_waking_event) { + kshark_unregister_event_handler(stream, + plugin_ctx->sched_waking_event->id, + plugin_sched_wakeup_action); + } kshark_unregister_draw_handler(stream, plugin_draw);
plugin_sched_init_context() is careful to make the sched_waking (or sched_wakeup{,_new}) event optional but the initializer blindly dereferences plugin_ctx->sched_waking_event which is null if no waking event is found. Add the necessary checks to avoid segfaults when (de)initializing the plugin. Signed-off-by: John Keeping <john@metanate.com> --- src/plugins/sched_events.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)