[Mono-dev] libgdiplus linecap issue

Francis A. Bausch fbausch at dracorp.com
Mon Oct 4 21:43:19 EDT 2010

unfortunately i was not carefui enough in my analysis.

this is my crash:

[Error, 10/4/2010, 9:21:22 PM] UNHANDLED EXCEPTION:
System.ArgumentException: A null reference or invalid value was found [GDI+ stat
us: InvalidParameter]
  at System.Drawing.GDIPlus.CheckStatus (Status status) [0x00000] in <filename u
  at System.Drawing.Graphics.DrawPath (System.Drawing.Pen pen, System.Drawing.Dr
awing2D.GraphicsPath path) [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) System.Drawing.Graphics:DrawPath (Syst

 the issue appears to be in the calculation of angle, in 
customlinecap.c::gdip_custom_linecap_angle (float x, float y, float otherend_x, float otherend_y)

gdip_custom_linecap_angle (float x, float y, float otherend_x, float otherend_y)
	float slope;
	double angle;
	if (y < otherend_y) {
		slope = (otherend_y - y) / (otherend_x - x);
		if (x < otherend_x) {
			angle = PI/2;
		} else {
			angle = PI/-2;
	} else {
		slope = (otherend_x - x) / (y - otherend_y);
		angle = 0;
	angle += atan (slope);

	return angle;

if otherend_x = x, or otherend_y=y, the calculation of slope may result in division by zero.

apologies for the hasty mis-analysis.

From: Francis A. Bausch
Sent: Monday, October 04, 2010 8:38 PM
To: mono-devel-list at lists.ximian.com
Subject: libgdiplus linecap issue

In the recent addition of linecaps to libgdiplus, an issue exists in the implementation of cairo_DrawPath in graphics-cairo.c.

A test on the value of count is needed to make sure array indices are valid at line 642:

gdip_pen_draw_custom_end_cap(graphics, pen, points[count-1].Y, points[count-2].X, points[count-2].Y, points[count-1].X)

it is obvious that count must be >= 2, but the functionality seems to require count > 2.

More information about the Mono-devel-list mailing list