[pulseaudio-discuss] [PATCH] sink-input, source-output: add a couple of assertions
Tanu Kaskinen
tanuk at iki.fi
Sun Oct 29 19:15:48 UTC 2017
Coverity complained about data->sink being possibly NULL when it's
dereferenced later. It was difficult for me to figure out whether that
was a false positive or not. Hopefully the comments make it a bit
easier to reason about the code in the future.
It might be a good idea to set data->req_formats early, so that it's
always set when setting the sink for a stream. Currently, if the
application doesn't use the new format negotiation API, req_formats is
set according to the sample spec at a very late stage. That means that
sometimes data->sink gets set after data->req_formats, and sometimes
data->req_formats gets set after data->sink, which makes it difficult to
follow the code.
CID: 1323591
---
src/pulsecore/sink-input.c | 5 +++++
src/pulsecore/source-output.c | 5 +++++
2 files changed, 10 insertions(+)
diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index 05fe2c026..f993322e9 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -338,6 +338,11 @@ int pa_sink_input_new(
data->format = pa_format_info_copy(pa_idxset_first(data->nego_formats, NULL));
if (PA_LIKELY(data->format)) {
+ /* We know that data->sink is set, because data->format has been set.
+ * data->format is set after a successful format negotiation, and that
+ * can't happen before data->sink has been set. */
+ pa_assert(data->sink);
+
pa_log_debug("Negotiated format: %s", pa_format_info_snprint(fmt, sizeof(fmt), data->format));
} else {
pa_format_info *format;
diff --git a/src/pulsecore/source-output.c b/src/pulsecore/source-output.c
index f8a421aa8..f8f4e0ef0 100644
--- a/src/pulsecore/source-output.c
+++ b/src/pulsecore/source-output.c
@@ -280,6 +280,11 @@ int pa_source_output_new(
data->format = pa_format_info_copy(pa_idxset_first(data->nego_formats, NULL));
if (PA_LIKELY(data->format)) {
+ /* We know that data->source is set, because data->format has been set.
+ * data->format is set after a successful format negotiation, and that
+ * can't happen before data->source has been set. */
+ pa_assert(data->source);
+
pa_log_debug("Negotiated format: %s", pa_format_info_snprint(fmt, sizeof(fmt), data->format));
} else {
pa_format_info *format;
--
2.14.2
More information about the pulseaudio-discuss
mailing list