On Tue, 2016-06-14 at 10:33 +0100, Frediano Ziglio wrote: > Do not access too much encoders data. > Slightly different as now if glz is frozen lz compression is used. This *seems* safe, though I don't know the code enough to know what side-effects it might have. Would like a second opinion. > > 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 6668dff..3547adc 100644 > --- a/server/dcc-encoders.c > +++ b/server/dcc-encoders.c > @@ -1191,6 +1191,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); > @@ -1241,8 +1252,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 e44feb7..3190c94 100644 > --- a/server/dcc.c > +++ b/server/dcc.c > @@ -740,19 +740,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 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel