Re: [cairo-commit] src/cairo-fixed-private.h src/cairo-path-stroke-boxes.c src/cairo-path-stroke.c src/cairo-path-stroke-polygon.c src/cairo-path-stroke-traps.c

Uli Schlachter <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
On 05.05.2017 02:47, Bryce Harrington wrote:
>  src/cairo-fixed-private.h       |   13 +++++++++++++
>  src/cairo-path-stroke-boxes.c   |   25 ++++++++++++++++++++-----
>  src/cairo-path-stroke-polygon.c |    1 +
>  src/cairo-path-stroke-traps.c   |    1 +
>  src/cairo-path-stroke.c         |    1 +
>  5 files changed, 36 insertions(+), 5 deletions(-)
> 
> New commits:
> commit 91b25005d62fe4ca178f45d349374e42c29a5e11
> Author: Chris Wilson <[email protected]>
> Date:   Fri Mar 24 12:36:41 2017 +0000
> 
>     stroker: Check for scaling overflow in computing half line widths
>     
>     Given a combination of a large scaling matrix and a large line, we can
>     easily generate a half line width that is unrepresentable in our 24.8
>     fixed-point. This leads to spurious errors later, such as generating
>     negative height boxes, and so asking pixman to fill to infinity. To
>     avoid this, we can check for overflow in calculating the half line with,
>     though we still lack adequate range checking on the final stroke path.
>     
>     References: https://bugs.webkit.org/show_bug.cgi?id=16793
>     Signed-off-by: Chris Wilson <[email protected]>
>     Cc: [email protected]
>     Tested-by: Bryce Harrington <[email protected]>
>     Acked-by: Bryce Harrington <[email protected]>

Hi Chris and Bryce,

[0] might not win the price for the best bug report, but he is right.
Running the test suite with CAIRO_TEST_TARGET=image on current master
results in the following, which did not happen before:

image (argb32): 9 crashed! - dash-offset dash-zero-length
degenerate-dash degenerate-path degenerate-solid-dash leaky-dash
leaky-dashed-rectangle line-width-large-overlap-dashed
line-width-overlap-dashed

When looking at dash-offset GDB says:

> (gdb) frame 4
> #4  0x00007ffff7ad5ccd in _cairo_rectilinear_stroker_emit_segments_dashed (stroker=stroker@entry=0x7fffffffc620)
>     at cairo-path-stroke-boxes.c:419
> 419		assert (box.p1.x < box.p2.x);
> (gdb) print box
> $1 = {p1 = {x = 9728, y = 1280}, p2 = {x = 9728, y = 1792}}

So I guess the assert should be "<=" instead of "<". Looking into
_cairo_boxes_add() (the function which is called in the above code with
the box) confirms this: It is a no-op for empty boxes and explicitly
handles this case.

Could you investigate and handle this? And please, not just this
instance, but also double-check all the other asserts that were added?

Cheers,
Uli

P.S.: Do we have a unit test for the overflow crash bug that the above
commit wants to fix?

[0]: https://bugs.freedesktop.org/show_bug.cgi?id=100952
-- 
"Do you know that books smell like nutmeg or some spice from a foreign
land?"
                                             -- Faber in Fahrenheit 451
-- 
cairo mailing list
[email protected]
https://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.