summaryrefslogtreecommitdiffstats
path: root/libass/ass_render.c
diff options
context:
space:
mode:
authorDr.Smile <vabnick@gmail.com>2020-09-27 03:07:47 +0300
committerDr.Smile <vabnick@gmail.com>2020-10-08 16:00:46 +0300
commit676f9dc5b52ef406c5527bdadbcb947f11392929 (patch)
treeb494cacaf1aedc5860e1e7aa46f4c6042180ce75 /libass/ass_render.c
parent962b1a39c10d64f1ddf7886d4c59ce45e576d55a (diff)
downloadlibass-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.c8
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;