<div dir="ltr">On Sat, Mar 25, 2017 at 8:55 AM, Carlos Garcia Campos <span dir="ltr"><<a href="mailto:carlosgc@gnome.org" target="_blank">carlosgc@gnome.org</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">Chris Wilson <<a href="mailto:chris@chris-wilson.co.uk">chris@chris-wilson.co.uk</a>> writes:<br>
<br>
> On Fri, Mar 24, 2017 at 04:55:54PM +0100, Uli Schlachter wrote:<br>
>> On <a href="tel:24.03.2017%2013" value="+12403201713">24.03.2017 13</a>:36, Chris Wilson wrote:<br>
>> > Given a combination of a large scaling matrix and a large line, we can<br>
>> > easily generate a half line width that is unrepresentable in our 24.8<br>
>> > fixed-point. This leads to spurious errors later, such as generating<br>
>> > negative height boxes, and so asking pixman to fill to infinity. To<br>
>> > avoid this, we can check for overflow in calculating the half line with,<br>
>> > though we still lack adequate range checking on the final stroke path.<br>
>> ><br>
>> > References: <a href="https://bugs.webkit.org/show_bug.cgi?id=16793" rel="noreferrer" target="_blank">https://bugs.webkit.org/show_<wbr>bug.cgi?id=16793</a><br>
>><br>
>> Are you sure that URL is the right one? That one has been closed as<br>
>> invalid 9 years ago.<br>
<br>
</span>Hey Chris, thanks for the patch!<br>
<br>
>  +2 <a href="http://bugs.webkit.org/show_bug.cgi?id=167932" rel="noreferrer" target="_blank">http://bugs.webkit.org/show_<wbr>bug.cgi?id=167932</a><br>
<br>
I'm not sure it's useful to include a URL of a security bug in the<br>
commit message, though. Maybe it would be better to just mention that<br>
it's causing crashes in WebKit.<br>
<span class="gmail-"><br>
> Actually looks like <a href="https://bugs.freedesktop.org/show_bug.cgi?id=90120" rel="noreferrer" target="_blank">https://bugs.freedesktop.org/<wbr>show_bug.cgi?id=90120</a><br>
<br>
</span>Right, same bt and same cause, negative height passed to pixman.<br></blockquote><div><br><div>Would it be possible to a test that reproduces the issue?<br></div><div>Ideally the test could be based on the librsvg bug report and avoid exposing (new?) security-critical information
 about how to trigger the crash in WebKit.<br>Instead of referencing the security bug, we could just mention that the patch fixes that test.<br><br></div><span class="gmail-"></span></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div class="gmail-HOEnZb"><div class="gmail-h5"><br>
> For which I wrote a different validation patch, which we should also<br>
> investigate. There is likely merit in combining/using both the<br>
> validation of the stroker ctm and also double checking against the<br>
> overflow in fixed-point conversion.<br>
><br>
>><br>
>> > Signed-off-by: Chris Wilson <<a href="mailto:chris@chris-wilson.co.uk">chris@chris-wilson.co.uk</a>><br>
>> > Cc: <a href="mailto:magomez@igalia.com">magomez@igalia.com</a><br>
>> > ---<br>
>> >  src/cairo-fixed-private.h       | 13 +++++++++++++<br>
>> >  src/cairo-path-stroke-boxes.c   | 25 ++++++++++++++++++++-----<br>
>> >  src/cairo-path-stroke-polygon.<wbr>c |  1 +<br>
>> >  src/cairo-path-stroke-traps.c   |  1 +<br>
>> >  src/cairo-path-stroke.c         |  1 +<br>
>> >  5 files changed, 36 insertions(+), 5 deletions(-)<br>
>> ><br>
>> > diff --git a/src/cairo-fixed-private.h b/src/cairo-fixed-private.h<br>
>> > index 9ff8f7503..8ee895b92 100644<br>
>> > --- a/src/cairo-fixed-private.h<br>
>> > +++ b/src/cairo-fixed-private.h<br>
>> > @@ -53,6 +53,9 @@<br>
>> >  #define CAIRO_FIXED_ONE_DOUBLE ((double)(1 << CAIRO_FIXED_FRAC_BITS))<br>
>> >  #define CAIRO_FIXED_EPSILON    ((cairo_fixed_t)(1))<br>
>> ><br>
>> > +#define CAIRO_FIXED_MAX           (~0u >> (CAIRO_FIXED_FRAC_BITS + 1))<br>
>> > +#define CAIRO_FIXED_MIN           (-(int)CAIRO_FIXED_MAX)<br>
>> > +<br>
>><br>
>> So... the above is basically (int)_cairo_fixed_to_double(<wbr>0x7fffffffu),<br>
>> right? "~0u >> 1" is supposed to be INT32_MAX (maximum fixed value) and<br>
>> this value is then converted to an integer via >> CAIRO_FIXED_FRAC_BITS.<br>
>><br>
>> How about replacing "~0u" with this constant, so that systems with<br>
>> sizeof(unsigned int) != 4 will also work fine?<br>
>><br>
>> Also, I do not like the name. CAIRO_FIXED_ONE is the number 1 as a fixed<br>
>> number, while CAIRO_FIXED_MAX is the maximum value as an integer. Could<br>
>> you name it CAIRO_FIXED_MAX_INT? (and same for MIN)<br>
>><br>
>> Oh and: This is not really the maximum value, since you shifted off some<br>
>> bits. Don't you need something like MAX =<br>
>> _cairo_fixed_to_double((cairo_<wbr>fixed_t)(~0u >> 1))<br>
><br>
> That's exactly equivalent to the above, prior to the (double) cast.<br>
><br>
>> _cairo_fixed_to_double((cairo_<wbr>fixed_t)(~0u)) (the later assuming<br>
>> two-complement's arithmetic and ignoring that signed overflow is<br>
>> undefined behaviour).<br>
>> I guess this difference is not all that important in practice. How about<br>
>> mentioning it in a comment next to the definition? "These are not the<br>
>> real limits, but just the closest whole numbers"<br>
><br>
> Yes, we could add one to upper and use >= (and vice version for the<br>
> lower).<br>
><br>
> CAIRO_FIXED_INT_UPPER_BOUND<br>
> CAIRO_FIXED_INT_LOWER_BOUND<br>
> ?<br>
> -Chris<br>
><br>
> --<br>
> Chris Wilson, Intel Open Source Technology Centre<br>
> --<br>
> cairo mailing list<br>
> <a href="mailto:cairo@cairographics.org">cairo@cairographics.org</a><br>
> <a href="https://lists.cairographics.org/mailman/listinfo/cairo" rel="noreferrer" target="_blank">https://lists.cairographics.<wbr>org/mailman/listinfo/cairo</a><br>
<br>
</div></div><span class="gmail-HOEnZb"><font color="#888888">--<br>
Carlos Garcia Campos<br>
PGP key: <a href="http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x523E6462" rel="noreferrer" target="_blank">http://pgp.mit.edu:11371/pks/<wbr>lookup?op=get&search=<wbr>0x523E6462</a><br>
</font></span><br>--<br>
cairo mailing list<br>
<a href="mailto:cairo@cairographics.org">cairo@cairographics.org</a><br>
<a href="https://lists.cairographics.org/mailman/listinfo/cairo" rel="noreferrer" target="_blank">https://lists.cairographics.<wbr>org/mailman/listinfo/cairo</a><br></blockquote></div><br></div></div>