diff options
author | Dr.Smile <vabnick@gmail.com> | 2020-09-27 03:07:47 +0300 |
---|---|---|
committer | Dr.Smile <vabnick@gmail.com> | 2020-10-08 16:00:46 +0300 |
commit | 676f9dc5b52ef406c5527bdadbcb947f11392929 (patch) | |
tree | b494cacaf1aedc5860e1e7aa46f4c6042180ce75 /libass/ass_render.c | |
parent | 962b1a39c10d64f1ddf7886d4c59ce45e576d55a (diff) | |
download | libass-676f9dc5b52ef406c5527bdadbcb947f11392929.tar.bz2 libass-676f9dc5b52ef406c5527bdadbcb947f11392929.tar.xz |
outline: fix overflows in outline processing
This commit enforces strict invariant on ASS_Outline
to contain point coordinates into predetermined range.
Fixes https://github.com/libass/libass/issues/431.
Diffstat (limited to 'libass/ass_render.c')
-rw-r--r-- | libass/ass_render.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c index cff7736b..62462746 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -1438,8 +1438,12 @@ get_bitmap_glyph(ASS_Renderer *render_priv, GlyphInfo *info, w *= STROKER_PRECISION / POSITION_PRECISION; frexp(w * (FFMAX(mxx, myx) + mzx * rz), &k->scale_ord_x); frexp(w * (FFMAX(mxy, myy) + mzy * rz), &k->scale_ord_y); - k->border.x = lrint(ldexp(bord_x, k->scale_ord_x) / STROKER_PRECISION); - k->border.y = lrint(ldexp(bord_y, k->scale_ord_y) / STROKER_PRECISION); + bord_x = ldexp(bord_x, k->scale_ord_x); + bord_y = ldexp(bord_y, k->scale_ord_y); + if (!(bord_x < OUTLINE_MAX && bord_y < OUTLINE_MAX)) + return; + k->border.x = lrint(bord_x / STROKER_PRECISION); + k->border.y = lrint(bord_y / STROKER_PRECISION); if (!k->border.x && !k->border.y) { ass_cache_inc_ref(info->bm); info->bm_o = info->bm; |