modules: avoid some leaks in error paths

This commit is contained in:
Wim Taymans 2023-03-16 11:44:56 +01:00
parent 1985eb3549
commit 79b6dab5f9
2 changed files with 27 additions and 12 deletions

View file

@ -721,14 +721,16 @@ static int session_load_source(struct session *session, struct pw_properties *pr
{ {
struct impl *impl = session->impl; struct impl *impl = session->impl;
struct pw_context *context = pw_impl_module_get_context(impl->module); struct pw_context *context = pw_impl_module_get_context(impl->module);
FILE *f; FILE *f = NULL;
char *args; char *args = NULL;
size_t size; size_t size;
const char *str, *media; const char *str, *media;
int res;
if ((f = open_memstream(&args, &size)) == NULL) { if ((f = open_memstream(&args, &size)) == NULL) {
res = -errno;
pw_log_error("Can't open memstream: %m"); pw_log_error("Can't open memstream: %m");
return -errno; goto done;
} }
fprintf(f, "{"); fprintf(f, "{");
@ -748,12 +750,14 @@ static int session_load_source(struct session *session, struct pw_properties *pr
if ((mime = pw_properties_get(props, "rtp.mime")) == NULL) { if ((mime = pw_properties_get(props, "rtp.mime")) == NULL) {
pw_log_error("missing rtp.mime property"); pw_log_error("missing rtp.mime property");
return -EINVAL; res = -EINVAL;
goto done;
} }
format_info = find_audio_format_info(mime); format_info = find_audio_format_info(mime);
if (format_info == NULL) { if (format_info == NULL) {
pw_log_error("unknown rtp.mime type %s", mime); pw_log_error("unknown rtp.mime type %s", mime);
return -EINVAL; res = -ENOTSUP;
goto done;
} }
fprintf(f, "\"sess.media\" = \"%s\", ", format_info->media_type); fprintf(f, "\"sess.media\" = \"%s\", ", format_info->media_type);
if (format_info->format_str != NULL) { if (format_info->format_str != NULL) {
@ -765,7 +769,8 @@ static int session_load_source(struct session *session, struct pw_properties *pr
} }
} else { } else {
pw_log_error("Unhandled media %s", media); pw_log_error("Unhandled media %s", media);
return -EINVAL; res = -EINVAL;
goto done;
} }
if ((str = pw_properties_get(props, "rtp.ts-offset")) != NULL) if ((str = pw_properties_get(props, "rtp.ts-offset")) != NULL)
fprintf(f, "\"sess.ts-offset\" = %s, ", str); fprintf(f, "\"sess.ts-offset\" = %s, ", str);
@ -775,23 +780,29 @@ static int session_load_source(struct session *session, struct pw_properties *pr
fprintf(f, " }"); fprintf(f, " }");
fprintf(f, "}"); fprintf(f, "}");
fclose(f); fclose(f);
f = NULL;
pw_log_info("loading new RTP source"); pw_log_info("loading new RTP source");
session->module = pw_context_load_module(context, session->module = pw_context_load_module(context,
"libpipewire-module-rtp-source", "libpipewire-module-rtp-source",
args, NULL); args, NULL);
free(args);
if (session->module == NULL) { if (session->module == NULL) {
res = -errno;
pw_log_error("Can't load module: %m"); pw_log_error("Can't load module: %m");
return -errno; goto done;
} }
pw_impl_module_add_listener(session->module, pw_impl_module_add_listener(session->module,
&session->module_listener, &session->module_listener,
&session_module_events, session); &session_module_events, session);
return 0; res = 0;
done:
if (f != NULL)
fclose(f);
free(args);
return res;
} }
struct match_info { struct match_info {

View file

@ -1158,6 +1158,7 @@ static int make_socket(const struct sockaddr_storage* sa, socklen_t salen,
return fd; return fd;
error: error:
close(fd);
return res; return res;
} }
@ -1172,8 +1173,10 @@ static int setup_apple_session(struct impl *impl)
impl->ctrl_source = pw_loop_add_io(impl->loop, fd, impl->ctrl_source = pw_loop_add_io(impl->loop, fd,
SPA_IO_IN, true, on_ctrl_io, impl); SPA_IO_IN, true, on_ctrl_io, impl);
if (impl->ctrl_source == NULL) if (impl->ctrl_source == NULL) {
close(fd);
return -errno; return -errno;
}
if ((fd = make_socket(&impl->data_addr, impl->data_len, if ((fd = make_socket(&impl->data_addr, impl->data_len,
impl->mcast_loop, impl->ttl, impl->ifname)) < 0) impl->mcast_loop, impl->ttl, impl->ifname)) < 0)
@ -1181,9 +1184,10 @@ static int setup_apple_session(struct impl *impl)
impl->data_source = pw_loop_add_io(impl->data_loop, fd, impl->data_source = pw_loop_add_io(impl->data_loop, fd,
SPA_IO_IN, true, on_data_io, impl); SPA_IO_IN, true, on_data_io, impl);
if (impl->data_source == NULL) if (impl->data_source == NULL) {
close(fd);
return -errno; return -errno;
}
return 0; return 0;
} }