From 4fa489276826e33fa5e21d0a94a8ed3e29ebcfd0 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 26 Feb 2023 18:46:09 -0800 Subject: [PATCH] altos/draw: Add validation for line drawing Just make sure it never draws outside the dest. Signed-off-by: Keith Packard --- src/draw/ao_line.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/draw/ao_line.c b/src/draw/ao_line.c index c6b49ee0..832a916c 100644 --- a/src/draw/ao_line.c +++ b/src/draw/ao_line.c @@ -54,8 +54,9 @@ * adjust_x = e / e1; */ - - +#ifdef VALIDATE +#include +#endif static void ao_bres(const struct ao_bitmap *dst_bitmap, @@ -88,9 +89,22 @@ ao_bres(const struct ao_bitmap *dst_bitmap, while (len--) { /* clip each point */ +#ifdef VALIDATE + if (x1 < 0 || dst_bitmap->width <= x1) { + printf("bad line x %d\n", x1); + return; + } + if (y1 < 0 || dst_bitmap->height <= y1) { + printf("bad line y %d\n", y1); + return; + } +#endif *dst = ao_do_mask_rrop(*dst, and, xor, mask); if (axis == X_AXIS) { +#ifdef VALIDATE + x1 += signdx; +#endif if (signdx < 0) mask = ao_left(mask, 1); else @@ -101,13 +115,22 @@ ao_bres(const struct ao_bitmap *dst_bitmap, } e += e1; if (e >= 0) { +#ifdef VALIDATE + y1 += signdy; +#endif dst += stride; e += e3; } } else { +#ifdef VALIDATE + y1 += signdy; +#endif dst += stride; e += e1; if (e >= 0) { +#ifdef VALIDATE + x1 += signdx; +#endif if (signdx < 0) mask = ao_left(mask, 1); else -- 2.30.2