diff options
author | Kim Woelders <kim@woelders.dk> | 2016-04-06 17:42:17 +0200 |
---|---|---|
committer | Kim Woelders <kim@woelders.dk> | 2016-04-07 20:24:32 +0200 |
commit | c94d83ccab15d5ef02f88d42dce38ed3f0892882 (patch) | |
tree | 4fa3b98db7529e5834e31e231ce4904a1e9f59c1 | |
parent | a8ca99a2a4ad5015f904b831b712d96b816ef13e (diff) | |
download | imlib2-c94d83ccab15d5ef02f88d42dce38ed3f0892882.tar.gz |
Fix potential divide-by-zero in imlib_image_draw_ellipse().
Attempting to draw a 2x1 ellipse with e.g. imlib_image_draw_ellipse(x, y, 2, 1)
causes a divide-by-zero.
It seems happy enough to draw 1x1, 1x2 and 2x2, but not 2x1.
Patch by Simon Lees.
https://bugs.debian.org/639414
-rw-r--r-- | src/lib/ellipse.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/lib/ellipse.c b/src/lib/ellipse.c index cd90268..ddb410b 100644 --- a/src/lib/ellipse.c +++ b/src/lib/ellipse.c @@ -71,6 +71,9 @@ __imlib_Ellipse_DrawToData(int xc, int yc, int a, int b, DATA32 color, if (IN_RANGE(rx, by, clw, clh)) pfunc(color, bp + len); + if (dx < 1) + dx = 1; + dy += b2; yy -= ((dy << 16) / dx); lx--; @@ -123,6 +126,9 @@ __imlib_Ellipse_DrawToData(int xc, int yc, int a, int b, DATA32 color, if (IN_RANGE(rx, by, clw, clh)) pfunc(color, bp + len); + if (dy < 1) + dy = 1; + dx -= a2; xx += ((dx << 16) / dy); ty++; @@ -222,6 +228,9 @@ __imlib_Ellipse_DrawToData_AA(int xc, int yc, int a, int b, DATA32 color, if (IN_RANGE(rx, by, clw, clh)) pfunc(col1, bp + len); + if (dx < 1) + dx = 1; + dy += b2; yy -= ((dy << 16) / dx); lx--; @@ -295,6 +304,9 @@ __imlib_Ellipse_DrawToData_AA(int xc, int yc, int a, int b, DATA32 color, if (IN_RANGE(rx, by, clw, clh)) pfunc(col1, bp + len); + if (dy < 1) + dy = 1; + dx -= a2; xx += ((dx << 16) / dy); ty++; @@ -395,6 +407,9 @@ __imlib_Ellipse_FillToData(int xc, int yc, int a, int b, DATA32 color, if (IN_RANGE(rx, by, clw, clh)) pfunc(color, bp + len); + if (dx < 1) + dx = 1; + dy += b2; yy -= ((dy << 16) / dx); lx--; @@ -453,6 +468,9 @@ __imlib_Ellipse_FillToData(int xc, int yc, int a, int b, DATA32 color, if (((unsigned)by < (unsigned)clh) && (len > 0)) sfunc(color, bpp, len); + if (dy < 1) + dy = 1; + dx -= a2; xx += ((dx << 16) / dy); ty++; @@ -556,6 +574,9 @@ __imlib_Ellipse_FillToData_AA(int xc, int yc, int a, int b, DATA32 color, if (IN_RANGE(rx, by, clw, clh)) pfunc(col1, bp + len); + if (dx < 1) + dx = 1; + dy += b2; yy -= ((dy << 16) / dx); lx--; @@ -629,6 +650,9 @@ __imlib_Ellipse_FillToData_AA(int xc, int yc, int a, int b, DATA32 color, if (IN_RANGE(rx, by, clw, clh)) pfunc(col1, bp + len); + if (dy < 1) + dy = 1; + dx -= a2; xx += ((dx << 16) / dy); ty++; |