[cairo] Endless loop in _cairo_stroker_line_to_dashed()

Chris Wilson chris at chris-wilson.co.uk
Sun Jun 28 03:24:00 PDT 2009

On Sun, 2009-06-28 at 12:00 +0200, Hans Breuer wrote:
> The loop "while (remain)" is only left if 'remain' evaluates to exactly 
> zero, but in the given case it never gets closer than 5.3172935301562e-315.
> Furher loop cycles don't modify that value anymore. 
> _cairo_stroker_add_sub_edge() adds no edge due to p1==p2 (in cairo fixed 
> oordinates). The patch below adds an additional check to leave the loop but 
> I'm uncertain if this is the right way to fix the issue.

Well I'm confused. If we exclude the possibility of precision-loss (it
uses doubles through out, though still that is no guarantee) then the
loop should always terminate, as it essentially does:
  while (remain) {
    step_length = MIN (remain, dash_remain);
    remain -= step_length;
    dash_remain -= step_length;
    if (dash_remain <= 0.) dash_remain=dashes[dash++];

It would be good to have a test case for this bug. Have you managed to
replicate this whilst tracing? I think you will need to add
CAIRO_TRACE_FLUSH=1 to your environment to capture the last operation
before the infinite loop. (Or you can provide instructions on how I can
reproduce this bug myself using dia, and I'll create a test case.)

More information about the cairo mailing list