From: MegaBrutal Date: Sun, 25 Dec 2022 01:15:00 +0000 (+0100) Subject: Canvas creation fails if dimensions are too large X-Git-Url: http://git.megabrutal.com/?p=litoprism.git;a=commitdiff_plain;h=dc56acbb48a11e5570983d815e99cb4c013e3133 Canvas creation fails if dimensions are too large --- diff --git a/src/main.rs b/src/main.rs index 2d58e6e..9d96a22 100644 --- a/src/main.rs +++ b/src/main.rs @@ -180,8 +180,14 @@ struct Canvas { } impl Canvas { - fn new(width: u32, height: u32) -> Canvas { - Canvas { pen: 0, img: ImageBuffer::new(width, height) } + fn new(width: u32, height: u32) -> Result { + // Image must not be larger than 1 megapixel + if width * height > 1048576 { + Err(ImageError::dimension_error().into()) + } + else { + Ok(Canvas { pen: 0, img: ImageBuffer::new(width, height) }) + } } /*fn from_image(img: RgbImage) -> Canvas { @@ -304,7 +310,7 @@ fn apply_to_canvas<'a, F>(f: F, canvas_option: &'a mut Option, dimension }, None => match dimensions { Some((dim_x, dim_y)) => - Ok(Canvas::new(dim_x, dim_y)), + Ok(Canvas::new(dim_x, dim_y)?), None => Err(CanvasError::NotExists) } @@ -406,7 +412,7 @@ async fn img_pgen0(req: HttpRequest, canvas0: web::Data>>) -> let scale = 16; let img: RgbImage = ({ let canvas_option = &mut *canvas0.lock().unwrap(); - Ok(apply_to_canvas( |c, d| rgb_encode_to_canvas(c, d), &mut canvas_option.0, None, data)?.img.clone()) + Ok(apply_to_canvas( |c, d| rgb_encode_to_canvas(c, d), &mut canvas_option.0, Some((32, 32)), data)?.img.clone()) } as Result)?; let cursor = image_to_cursor(img, scale)?; Ok(response_image!(cursor)) @@ -447,7 +453,7 @@ async fn img_pgen3(req: HttpRequest, path: web::Path, canvas2: web::Data canvas, - None => Canvas::new(60 * TIMEAVATAR_SIZE_U32, 24 * TIMEAVATAR_SIZE_U32) + None => Canvas::new(60 * TIMEAVATAR_SIZE_U32, 24 * TIMEAVATAR_SIZE_U32)? }; overlay(&mut canvas.img, &rgbimg, minute * TIMEAVATAR_SIZE_I64, hour * TIMEAVATAR_SIZE_I64); Ok(canvas_option.0.insert(canvas).img.clone()) @@ -524,7 +530,7 @@ async fn main() -> std::io::Result<()> { .init(); let listenaddress = env::args().nth(1).unwrap_or_else(|| "127.0.0.1:8080".to_string()); - let canvas0 = Arc::new(Mutex::new(Canvas0(Some(Canvas::new(32, 32))))); + let canvas0 = Arc::new(Mutex::new(Canvas0(None))); let canvas1 = Arc::new(Mutex::new(Canvas1(None))); let canvas2 = Arc::new(Mutex::new(Canvas2(None)));