Do not access too much encoders data. Slightly different as now if glz is frozen lz compression is used. Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/dcc-encoders.c | 15 +++++++++++++++ server/dcc.c | 21 ++++++--------------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/server/dcc-encoders.c b/server/dcc-encoders.c index 899e549..fcb6e11 100644 --- a/server/dcc-encoders.c +++ b/server/dcc-encoders.c @@ -1192,6 +1192,17 @@ int dcc_compress_image_glz(EncodersData *enc, spice_info("LZ global compress fmt=%d", src->format); #endif + if ((src->x * src->y) >= glz_enc_dictionary_get_size(enc->glz_dict->dict)) { + return FALSE; + } + + pthread_rwlock_rdlock(&enc->glz_dict->encode_lock); + /* using the global dictionary only if it is not frozen */ + if (enc->glz_dict->migrate_freeze) { + pthread_rwlock_unlock(&enc->glz_dict->encode_lock); + return FALSE; + } + encoder_data_init(&glz_data->data); glz_drawable = get_glz_drawable(enc, drawable); @@ -1242,8 +1253,12 @@ int dcc_compress_image_glz(EncodersData *enc, o_comp_data->comp_buf_size = zlib_size; stat_compress_add(zlib_glz_stats, start_time, glz_size, zlib_size); + pthread_rwlock_unlock(&enc->glz_dict->encode_lock); return TRUE; + glz: + pthread_rwlock_unlock(&enc->glz_dict->encode_lock); + dest->descriptor.type = SPICE_IMAGE_TYPE_GLZ_RGB; dest->u.lz_rgb.data_size = glz_size; diff --git a/server/dcc.c b/server/dcc.c index f5749c0..13ce0c5 100644 --- a/server/dcc.c +++ b/server/dcc.c @@ -742,21 +742,12 @@ int dcc_compress_image(DisplayChannelClient *dcc, success = dcc_compress_image_quic(&dcc->encoders, dest, src, o_comp_data, &display_channel->quic_stat); break; case SPICE_IMAGE_COMPRESSION_GLZ: - if ((src->x * src->y) < glz_enc_dictionary_get_size(dcc->encoders.glz_dict->dict)) { - int frozen; - /* using the global dictionary only if it is not frozen */ - pthread_rwlock_rdlock(&dcc->encoders.glz_dict->encode_lock); - frozen = dcc->encoders.glz_dict->migrate_freeze; - if (!frozen) { - success = dcc_compress_image_glz(&dcc->encoders, dest, src, drawable, o_comp_data, - display_channel->enable_zlib_glz_wrap, - &display_channel->glz_stat, - &display_channel->zlib_glz_stat); - } - pthread_rwlock_unlock(&dcc->encoders.glz_dict->encode_lock); - if (!frozen) { - break; - } + success = dcc_compress_image_glz(&dcc->encoders, dest, src, drawable, o_comp_data, + display_channel->enable_zlib_glz_wrap, + &display_channel->glz_stat, + &display_channel->zlib_glz_stat); + if (success) { + break; } goto lz_compress; #ifdef USE_LZ4 -- 2.7.4 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel