From 78b039be58142c755571b661f57400bc92ad2fd5 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Tue, 3 Dec 2024 19:51:07 +0100 Subject: [PATCH] fix: integer overflow crashes with large screen sizes > u16 --- build.zig.zon | 4 ++-- src/tui/home.zig | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index a281e3c..abc3aa2 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -30,8 +30,8 @@ .hash = "122019f077d09686b1ec47928ca2b4bf264422f3a27afc5b49dafb0129a4ceca0d01", }, .vaxis = .{ - .url = "https://github.com/neurocyte/libvaxis/archive/352fa9c89d6339325b9f851b9a27e62ec79ba33c.tar.gz", - .hash = "1220e604b723781b4a306db5801eee419a689b4d470232a1bacc525f45f00d455b1a", + .url = "https://github.com/neurocyte/libvaxis/archive/ffe35b4342bd2913efd46c35c0ccd15544ac87e6.tar.gz", + .hash = "12202ee9842d28927674e552f1ea41e2c41e59f6b4b5d290de9b6fd626fd332ac627", }, .zeit = .{ .url = "https://github.com/rockorager/zeit/archive/9cca8ec620a54c3b07cd249f25e5bcb3153d03d7.tar.gz", diff --git a/src/tui/home.zig b/src/tui/home.zig index 5ec6a1a..9657743 100644 --- a/src/tui/home.zig +++ b/src/tui/home.zig @@ -228,12 +228,12 @@ const Fire = struct { //scope cache - spread fire spread_px: u8 = 0, spread_rnd_idx: u8 = 0, - spread_dst: u16 = 0, + spread_dst: usize = 0, FIRE_H: u16, FIRE_W: u16, - FIRE_SZ: u16, - FIRE_LAST_ROW: u16, + FIRE_SZ: usize, + FIRE_LAST_ROW: usize, screen_buf: []u8, @@ -254,12 +254,12 @@ const Fire = struct { }), .FIRE_H = FIRE_H, .FIRE_W = FIRE_W, - .FIRE_SZ = FIRE_H * FIRE_W, - .FIRE_LAST_ROW = (FIRE_H - 1) * FIRE_W, - .screen_buf = try allocator.alloc(u8, FIRE_H * FIRE_W), + .FIRE_SZ = @as(usize, @intCast(FIRE_H)) * FIRE_W, + .FIRE_LAST_ROW = @as(usize, @intCast(FIRE_H - 1)) * FIRE_W, + .screen_buf = try allocator.alloc(u8, @as(usize, @intCast(FIRE_H)) * FIRE_W), }; - var buf_idx: u16 = 0; + var buf_idx: usize = 0; while (buf_idx < self.FIRE_SZ) : (buf_idx += 1) { self.screen_buf[buf_idx] = fire_black; } @@ -289,7 +289,7 @@ const Fire = struct { while (doFire_x < self.FIRE_W) : (doFire_x += 1) { var doFire_y: u16 = 0; while (doFire_y < self.FIRE_H) : (doFire_y += 1) { - const doFire_idx: u16 = doFire_y * self.FIRE_W + doFire_x; + const doFire_idx = @as(usize, @intCast(doFire_y)) * self.FIRE_W + doFire_x; //spread fire self.spread_px = self.screen_buf[doFire_idx]; @@ -328,8 +328,8 @@ const Fire = struct { //each character rendered is actually to rows of 'pixels' // - "hi" (current px row => fg char) // - "low" (next row => bg color) - const px_hi = self.screen_buf[frame_y * self.FIRE_W + frame_x]; - const px_lo = self.screen_buf[(frame_y + 1) * self.FIRE_W + frame_x]; + const px_hi = self.screen_buf[@as(usize, @intCast(frame_y)) * self.FIRE_W + frame_x]; + const px_lo = self.screen_buf[@as(usize, @intCast(frame_y + 1)) * self.FIRE_W + frame_x]; self.plane.set_fg_palindex(fire_palette[px_hi]) catch {}; self.plane.set_bg_palindex(fire_palette[px_lo]) catch {};