[Spice-devel] [spice-server v3 06/11] reds: don't replace video_codecs on failure
Frediano Ziglio
fziglio at redhat.com
Thu Dec 15 11:14:34 UTC 2016
>
> From: Victor Toso <me at victortoso.com>
>
> We should replace the video_codecs GArray only after the parsing of
> input is done, otherwise we might lose previous configuration.
>
> Tests were updated to match this situation. Input that fails to
> replace video_codecs are considered bad.
>
> Signed-off-by: Victor Toso <victortoso at redhat.com>
Acked-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> server/reds.c | 17 +++++++++++++----
> server/tests/test-codecs-parsing.c | 32 ++++++++++++++++++++++++++++----
> 2 files changed, 41 insertions(+), 8 deletions(-)
>
> diff --git a/server/reds.c b/server/reds.c
> index 6064a6d..3b30928 100644
> --- a/server/reds.c
> +++ b/server/reds.c
> @@ -3538,6 +3538,7 @@ static const char* parse_video_codecs(const char
> *codecs, char **encoder,
> static void reds_set_video_codecs(RedsState *reds, const char *codecs)
> {
> char *encoder_name, *codec_name;
> + GArray *video_codecs;
>
> g_return_if_fail(codecs != NULL);
>
> @@ -3545,9 +3546,7 @@ static void reds_set_video_codecs(RedsState *reds,
> const char *codecs)
> codecs = default_video_codecs;
> }
>
> - /* The video_codecs array is immutable */
> - g_array_unref(reds->config->video_codecs);
> - reds->config->video_codecs = g_array_new(FALSE, FALSE,
> sizeof(RedVideoCodec));
> + video_codecs = g_array_new(FALSE, FALSE, sizeof(RedVideoCodec));
> const char *c = codecs;
> while ( (c = parse_video_codecs(c, &encoder_name, &codec_name)) ) {
> uint32_t encoder_index, codec_index;
> @@ -3568,13 +3567,23 @@ static void reds_set_video_codecs(RedsState *reds,
> const char *codecs)
> new_codec.create = video_encoder_procs[encoder_index];
> new_codec.type = video_codec_names[codec_index].id;
> new_codec.cap = video_codec_caps[codec_index];
> - g_array_append_val(reds->config->video_codecs, new_codec);
> + g_array_append_val(video_codecs, new_codec);
> }
>
> free(encoder_name);
> free(codec_name);
> codecs = c;
> }
> +
> + if (video_codecs->len == 0) {
> + spice_warning("Failed to set video codecs, input string: '%s'",
> codecs);
> + g_array_unref(video_codecs);
> + return;
> + }
> +
> + /* The video_codecs array is immutable */
> + g_array_unref(reds->config->video_codecs);
> + reds->config->video_codecs = video_codecs;
> }
>
> SPICE_GNUC_VISIBLE int spice_server_init(SpiceServer *reds,
> SpiceCoreInterface *core)
> diff --git a/server/tests/test-codecs-parsing.c
> b/server/tests/test-codecs-parsing.c
> index c1b3276..5af2e5d 100644
> --- a/server/tests/test-codecs-parsing.c
> +++ b/server/tests/test-codecs-parsing.c
> @@ -28,9 +28,6 @@ static void codecs_good(void)
> {
> guint i;
> const gchar *codecs[] = {
> - "",
> - ";",
> - ";;;;",
> "spice:mjpeg",
> "spice:mjpeg;;;",
> "spice:mjpeg;;spice:mjpeg;;;",
> @@ -62,45 +59,70 @@ static void codecs_bad(void)
> const gchar *codecs;
> const GLogLevelFlags log_level;
> const gchar *error_message;
> + gboolean default_err_message;
> } test_cases[] = {
> {
> + "",
> + G_LOG_LEVEL_WARNING,
> + "*Failed to set video codecs*",
> + FALSE,
> + },{
> + ";",
> + G_LOG_LEVEL_WARNING,
> + "*Failed to set video codecs*",
> + FALSE,
> + },{
> + ";;;;",
> + G_LOG_LEVEL_WARNING,
> + "*Failed to set video codecs*",
> + FALSE,
> + },{
> NULL,
> G_LOG_LEVEL_CRITICAL,
> - "*assertion 'codecs != NULL' failed"
> + "*assertion 'codecs != NULL' failed",
> + FALSE,
> },{
> ";:;",
> G_LOG_LEVEL_WARNING,
> "*spice: invalid encoder:codec value*",
> + TRUE,
> },{
> "::::",
> G_LOG_LEVEL_WARNING,
> "*spice: invalid encoder:codec value*",
> + TRUE,
> },{
> "missingcolon",
> G_LOG_LEVEL_WARNING,
> "*spice: invalid encoder:codec value*",
> + TRUE,
> },{
> ":missing_encoder",
> G_LOG_LEVEL_WARNING,
> "*spice: invalid encoder:codec value*",
> + TRUE,
> },{
> "missing_value:;",
> G_LOG_LEVEL_WARNING,
> "*spice: invalid encoder:codec value*",
> + TRUE,
> },{
> "unknown_encoder:mjpeg",
> G_LOG_LEVEL_WARNING,
> "*spice: unknown video encoder unknown_encoder",
> + TRUE,
> },{
> "spice:unknown_codec",
> G_LOG_LEVEL_WARNING,
> "*spice: unknown video codec unknown_codec",
> + TRUE,
> },
> #if !defined(HAVE_GSTREAMER_1_0) && !defined(HAVE_GSTREAMER_0_10)
> {
> "gstreamer:mjpeg",
> G_LOG_LEVEL_WARNING,
> "*spice: unsupported video encoder gstreamer",
> + TRUE,
> }
> #endif
> };
> @@ -111,6 +133,8 @@ static void codecs_bad(void)
>
> for (i = 0; i < G_N_ELEMENTS(test_cases); ++i) {
> g_test_expect_message(G_LOG_DOMAIN, test_cases[i].log_level,
> test_cases[i].error_message);
> + if (test_cases[i].default_err_message)
> + g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
> "*Failed to set video codecs*");
> g_assert_cmpint(spice_server_set_video_codecs(server,
> test_cases[i].codecs), ==, 0);
> g_test_assert_expected_messages();
> }
Frediano
More information about the Spice-devel
mailing list