[cairo-bugs] [Bug 101531] New: NULL pointer dereference in cairo-polygon-intersect.c:1170

bugzilla-daemon at freedesktop.org bugzilla-daemon at freedesktop.org
Tue Jun 20 21:26:11 UTC 2017


https://bugs.freedesktop.org/show_bug.cgi?id=101531

            Bug ID: 101531
           Summary: NULL pointer dereference in
                    cairo-polygon-intersect.c:1170
           Product: cairo
           Version: unspecified
          Hardware: Other
                OS: All
            Status: NEW
          Severity: normal
          Priority: medium
         Component: general
          Assignee: chris at chris-wilson.co.uk
          Reporter: foca at salesforce.com
        QA Contact: cairo-bugs at cairographics.org

Created attachment 132102
  --> https://bugs.freedesktop.org/attachment.cgi?id=132102&action=edit
Proof of concept

There is a NULL pointer dereference in cairo-polygon-intersect.c:1170 in
function active_edges:
1142    static inline void
1143    active_edges (cairo_bo_edge_t           *left,
1144                  int32_t                    top,
1145                  cairo_polygon_t           *polygon)
1146    {
...
1150            /* Yes, this is naive. Consider this a placeholder. */
1151    
1152            while (left != NULL) {
1153                assert (is_zero (winding));
1154    
1155                do {
1156                    winding[left->a_or_b] += left->edge.dir;
1157                    if (! is_zero (winding))
1158                        break;
1159    
1160                    if unlikely ((left->deferred.other))
1161                        edges_end (left, top, polygon);
1162    
1163                    left = left->next;
1164                    if (! left)
1165                        return;
1166                } while (1);
1167    
1168                right = left->next;
1169                do {
1170                    if unlikely ((right->deferred.other))

left ->next is NULL in line 1168 so right is also set to NULL. When line 1170
is reached, the program tries to get deferred. Since right is 0, the program
tries to dereference 0x30 causing a segmentation fault.

This could be avoided with an extra check in 1169:
1169                if (right == NULL) return;

This bug was found when using a poppler util, pdftocairo. A PoC is attached. To
reproduce the bug use:
pdftocairo -svg PoC.pdf

This vulnerability has been found by Offensive Research at Salesforce.com:
Alberto Garcia (@algillera), Francisco Oca (@francisco_oca) & Suleman Ali
(@Salbei_)

-- 
You are receiving this mail because:
You are the QA Contact for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.cairographics.org/archives/cairo-bugs/attachments/20170620/d2f842c9/attachment.html>


More information about the cairo-bugs mailing list