Do not access too much encoders data. Slightly different as now if glz is frozen lz compression is used. Glz is frozen only during migration. Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/dcc-encoders.c | 15 +++++++++++++++ server/dcc.c | 17 ++++------------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/server/dcc-encoders.c b/server/dcc-encoders.c index e53fd24..7a6a87d 100644 --- a/server/dcc-encoders.c +++ b/server/dcc-encoders.c @@ -1195,6 +1195,17 @@ int image_encoders_compress_glz(ImageEncoders *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); @@ -1245,8 +1256,12 @@ int image_encoders_compress_glz(ImageEncoders *enc, o_comp_data->comp_buf_size = zlib_size; stat_compress_add(&enc->shared_data->zlib_glz_stat, 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 099f5f6..e5c80ad 100644 --- a/server/dcc.c +++ b/server/dcc.c @@ -735,19 +735,10 @@ int dcc_compress_image(DisplayChannelClient *dcc, success = image_encoders_compress_quic(&dcc->encoders, dest, src, o_comp_data); 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 = image_encoders_compress_glz(&dcc->encoders, dest, src, drawable, o_comp_data, - display_channel->enable_zlib_glz_wrap); - } - pthread_rwlock_unlock(&dcc->encoders.glz_dict->encode_lock); - if (!frozen) { - break; - } + success = image_encoders_compress_glz(&dcc->encoders, dest, src, drawable, o_comp_data, + display_channel->enable_zlib_glz_wrap); + 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