From f60bdcef71be791ebe291309b40e5131a5424cf8 Mon Sep 17 00:00:00 2001 From: Tobias Jakobi Date: Sun, 9 May 2021 13:44:10 +0200 Subject: [PATCH] screencast: improve cleanup on error in xdpw_screencast_init() - currently the cleanup can segfault due to uninitialized list objects - introduce xdpw_pwr_context_destroy() and fixup goto logic --- include/pipewire_screencast.h | 1 + src/screencast/pipewire_screencast.c | 16 ++++++++++++++++ src/screencast/screencast.c | 11 +++++++---- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/include/pipewire_screencast.h b/include/pipewire_screencast.h index 9d58661..940188c 100644 --- a/include/pipewire_screencast.h +++ b/include/pipewire_screencast.h @@ -9,5 +9,6 @@ void xdpw_pwr_stream_create(struct xdpw_screencast_instance *cast); void xdpw_pwr_stream_destroy(struct xdpw_screencast_instance *cast); int xdpw_pwr_context_create(struct xdpw_state *state); +void xdpw_pwr_context_destroy(struct xdpw_state *state); #endif diff --git a/src/screencast/pipewire_screencast.c b/src/screencast/pipewire_screencast.c index 384ca1b..17be160 100644 --- a/src/screencast/pipewire_screencast.c +++ b/src/screencast/pipewire_screencast.c @@ -229,6 +229,22 @@ int xdpw_pwr_context_create(struct xdpw_state *state) { return 0; } +void xdpw_pwr_context_destroy(struct xdpw_state *state) { + struct xdpw_screencast_context *ctx = &state->screencast; + + logprint(DEBUG, "pipewire: disconnecting fom core"); + + if (ctx->core) { + pw_core_disconnect(ctx->core); + ctx->core = NULL; + } + + if (ctx->pwr_context) { + pw_context_destroy(ctx->pwr_context); + ctx->pwr_context = NULL; + } +} + void xdpw_pwr_stream_destroy(struct xdpw_screencast_instance *cast) { if (!cast->stream) { return; diff --git a/src/screencast/screencast.c b/src/screencast/screencast.c index bab7d28..c62b551 100644 --- a/src/screencast/screencast.c +++ b/src/screencast/screencast.c @@ -474,19 +474,22 @@ int xdpw_screencast_init(struct xdpw_state *state) { int err; err = xdpw_pwr_context_create(state); if (err) { - goto end; + goto fail_pipewire; } err = xdpw_wlr_screencopy_init(state); if (err) { - goto end; + goto fail_screencopy; } return sd_bus_add_object_vtable(state->bus, &slot, object_path, interface_name, screencast_vtable, state); -end: - // TODO: clean up pipewire +fail_screencopy: xdpw_wlr_screencopy_finish(&state->screencast); + +fail_pipewire: + xdpw_pwr_context_destroy(state); + return err; }