summaryrefslogtreecommitdiffstats
path: root/libass
diff options
context:
space:
mode:
authorGrigori Goronzy <greg@chown.ath.cx>2016-10-04 21:25:41 +0200
committerGrigori Goronzy <greg@chown.ath.cx>2016-10-05 00:38:35 +0200
commitf4f48950788b91c6a30029cc28a240b834713ea7 (patch)
tree80037d66fbf7b4b8f96b12dc5ed9da06d81e9e14 /libass
parent08e754612019ed84d1db0d1fc4f5798248decd75 (diff)
downloadlibass-f4f48950788b91c6a30029cc28a240b834713ea7.tar.bz2
libass-f4f48950788b91c6a30029cc28a240b834713ea7.tar.xz
Fix line wrapping mode 0/3 bugs
This fixes two separate bugs: a) Don't move a linebreak into the first symbol. This results in a empty line at the front, which does not help to equalize line lengths at all. Instead, merge line with the second one. b) When moving a linebreak into a symbol that already is a break, the number of lines must be decremented. Otherwise, uninitialized memory is possibly used for later layout operations. Found by fuzzer test case id:000085,sig:11,src:003377+003350,op:splice,rep:8. This might also affect and hopefully fix libass#229. v2: change semantics according to review
Diffstat (limited to 'libass')
-rw-r--r--libass/ass_render.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c
index 8790408..1d3c0c5 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -1608,7 +1608,10 @@ wrap_lines_smart(ASS_Renderer *render_priv, double max_text_width)
(w->bbox.xMin + w->pos.x));
if (DIFF(l1_new, l2_new) < DIFF(l1, l2)) {
- w->linebreak = 1;
+ if (w->linebreak || w == text_info->glyphs)
+ text_info->n_lines--;
+ if (w != text_info->glyphs)
+ w->linebreak = 1;
s2->linebreak = 0;
exit = 0;
}