From c87df7ea2fcdc41b2b157b9a7fb4b52dd839b0a7 Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Tue, 15 Apr 2025 11:56:03 +0200 Subject: [PATCH] vdisp/ndi: fix leaks when init fails Handle the free with display_ndi_done (was adjusted to handle partial destroy). CID 472125 --- src/video_display/ndi.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/video_display/ndi.c b/src/video_display/ndi.c index 866a1cfe6..93e1aae7e 100644 --- a/src/video_display/ndi.c +++ b/src/video_display/ndi.c @@ -67,6 +67,7 @@ #define DEFAULT_AUDIO_LEVEL 0 #define MOD_NAME "[NDI disp.] " +static void display_ndi_done(void *state); typedef void ndi_disp_convert_t(const struct video_frame *f, char *out); static void ndi_disp_convert_Y216_to_P216(const struct video_frame *f, char *out); static void ndi_disp_convert_Y416_to_PA16(const struct video_frame *f, char *out); @@ -233,7 +234,7 @@ static void *display_ndi_init(struct module *parent, const char *fmt, unsigned i s->NDIlib = NDIlib_load(&s->lib); if (s->NDIlib == NULL) { MSG(ERROR, "Cannot open NDI library!\n"); - free(s); + display_ndi_done(s); return NULL; } @@ -241,7 +242,7 @@ static void *display_ndi_init(struct module *parent, const char *fmt, unsigned i if (!s->NDIlib->initialize()) { MSG(ERROR, "Cannot initialize NDI library!\n"); - free(s); + display_ndi_done(s); return NULL; } @@ -253,7 +254,7 @@ static void *display_ndi_init(struct module *parent, const char *fmt, unsigned i }; s->pNDI_send = s->NDIlib->send_create(&NDI_send_create_desc); if (s->pNDI_send == NULL) { - free(s); + display_ndi_done(s); return NULL; } @@ -265,13 +266,18 @@ static void *display_ndi_init(struct module *parent, const char *fmt, unsigned i static void display_ndi_done(void *state) { struct display_ndi *s = (struct display_ndi *) state; - - // wait for the async frame to be processed - s->NDIlib->send_send_video_async_v2(s->pNDI_send, NULL); - - s->NDIlib->send_destroy(s->pNDI_send); + if (s == NULL) { + return; + } + if (s->pNDI_send != NULL) { + // wait for the async frame to be processed + s->NDIlib->send_send_video_async_v2(s->pNDI_send, NULL); + s->NDIlib->send_destroy(s->pNDI_send); + } free(s->convert_buffer); - s->NDIlib->destroy(); + if (s->NDIlib != NULL) { + s->NDIlib->destroy(); + } close_ndi_library(s->lib); vf_free(s->send_frame); free(s->video_metadata);