shift_event() can change "bitmap" field of ASS_Image struct
so direct deallocation is no longer possible.
This commit introduces additional field "buffer"
into ASS_ImagePriv for that purpose.
Fixes https://github.com/libass/libass/issues/310.
img->source = source;
ass_cache_inc_ref(source);
+ img->buffer = source ? NULL : bitmap;
img->ref_count = 0;
return &img->result;
cur->stride = ns;
}
- cur->bitmap = nbuffer;
ASS_ImagePriv *priv = (ASS_ImagePriv *) cur;
+ priv->buffer = cur->bitmap = nbuffer;
ass_cache_dec_ref(priv->source);
priv->source = NULL;
}
do {
ASS_ImagePriv *priv = (ASS_ImagePriv *) img;
img = img->next;
- if (priv->source)
- ass_cache_dec_ref(priv->source);
- else
- ass_aligned_free(priv->result.bitmap);
+ ass_cache_dec_ref(priv->source);
+ ass_aligned_free(priv->buffer);
free(priv);
} while (img);
}
typedef struct {
ASS_Image result;
CompositeHashValue *source;
+ unsigned char *buffer;
size_t ref_count;
} ASS_ImagePriv;