Re: [PATCH 2/2] audio: Avoid bad pipelines from gst_parse_launch

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Nov 25, 2014 at 5:25 PM, Victor Toso <victortoso@xxxxxxxxxx> wrote:
> gst_parse_launch may return not NULL even when error is set.
> This can lead to data loss when playing or recording audio.
> ---
>  gtk/spice-gstaudio.c | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/gtk/spice-gstaudio.c b/gtk/spice-gstaudio.c
> index 5f9abb2..d6cc774 100644
> --- a/gtk/spice-gstaudio.c
> +++ b/gtk/spice-gstaudio.c
> @@ -245,7 +245,7 @@ static void record_start(SpiceRecordChannel *channel, gint format, gint channels
>                              "appsink caps=\"%s\" name=appsink", audio_caps);
>
>          p->record.pipe = gst_parse_launch(pipeline, &error);
> -        if (p->record.pipe == NULL) {
> +        if (error != NULL) {
>              g_warning("Failed to create pipeline: %s", error->message);
>              goto lerr;
>          }
> @@ -269,6 +269,10 @@ static void record_start(SpiceRecordChannel *channel, gint format, gint channels
>  #endif
>
>  lerr:
> +        if (error != NULL && p->record.pipe != NULL) {
> +            gst_object_unref(p->record.pipe);
> +            p->record.pipe = NULL;
> +        }

Considering you're not going for the small refactoring right now ...
Do not check for error twice, just unref and nullify the the pipe in
the first check.

>          g_clear_error(&error);
>          g_free(audio_caps);
>          g_free(pipeline);
> @@ -345,7 +349,7 @@ static void playback_start(SpicePlaybackChannel *channel, gint format, gint chan
>                                         "audioconvert ! audioresample ! autoaudiosink name=\"audiosink\"", audio_caps);
>          SPICE_DEBUG("audio pipeline: %s", pipeline);
>          p->playback.pipe = gst_parse_launch(pipeline, &error);
> -        if (p->playback.pipe == NULL) {
> +        if (error != NULL) {
>              g_warning("Failed to create pipeline: %s", error->message);
>              goto lerr;
>          }
> @@ -355,6 +359,10 @@ static void playback_start(SpicePlaybackChannel *channel, gint format, gint chan
>          p->playback.channels = channels;
>
>  lerr:
> +        if (error != NULL && p->playback.pipe != NULL) {
> +            gst_object_unref(p->playback.pipe);
> +            p->playback.pipe = NULL;
> +        }

Same here ...

>          g_clear_error(&error);
>          g_free(audio_caps);
>          g_free(pipeline);
> --
> 2.1.0
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel@xxxxxxxxxxxxxxxxxxxxx
> http://lists.freedesktop.org/mailman/listinfo/spice-devel



-- 
Fabiano Fidêncio
_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/spice-devel





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]