From 837988f61ea82afa7de72de57ffb70320030af75 Mon Sep 17 00:00:00 2001 From: tychovrahe Date: Sun, 21 Aug 2022 18:39:14 +0200 Subject: [PATCH] fix(core/rust): fix uzlib window allocation [no changelog] --- core/embed/rust/src/trezorhal/uzlib.rs | 14 +++++++------- core/embed/rust/src/ui/display.rs | 18 ++++++++++++------ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/core/embed/rust/src/trezorhal/uzlib.rs b/core/embed/rust/src/trezorhal/uzlib.rs index a10b33b5b..672deb45c 100644 --- a/core/embed/rust/src/trezorhal/uzlib.rs +++ b/core/embed/rust/src/trezorhal/uzlib.rs @@ -13,25 +13,25 @@ impl Default for ffi::uzlib_uncomp { pub struct UzlibContext<'a> { uncomp: ffi::uzlib_uncomp, src_data: PhantomData<&'a [u8]>, - window: Option<[u8; UZLIB_WINDOW_SIZE]>, } impl<'a> UzlibContext<'a> { - pub fn new(src: &'a [u8], use_window: bool) -> Self { - let window = use_window.then_some([0_u8; UZLIB_WINDOW_SIZE]); - + pub fn new(src: &'a [u8], window: Option<&'a mut [u8; UZLIB_WINDOW_SIZE]>) -> Self { let mut ctx = Self { uncomp: uzlib_uncomp::default(), src_data: Default::default(), - window, }; unsafe { ctx.uncomp.source = src.as_ptr(); ctx.uncomp.source_limit = src.as_ptr().add(src.len()); - if let Some(w) = ctx.window { - ffi::uzlib_uncompress_init(&mut ctx.uncomp, w.as_ptr() as _, w.len() as u32); + if let Some(w) = window { + ffi::uzlib_uncompress_init( + &mut ctx.uncomp, + w.as_mut_ptr() as _, + UZLIB_WINDOW_SIZE as u32, + ); } else { ffi::uzlib_uncompress_init(&mut ctx.uncomp, ptr::null_mut(), 0); } diff --git a/core/embed/rust/src/ui/display.rs b/core/embed/rust/src/ui/display.rs index 5cb34704b..df559ffb3 100644 --- a/core/embed/rust/src/ui/display.rs +++ b/core/embed/rust/src/ui/display.rs @@ -1,14 +1,18 @@ -use super::constant; +use super::{ + constant, + geometry::{Offset, Point, Rect}, +}; use crate::{ error::Error, time::Duration, - trezorhal::{display, qr, time, uzlib}, + trezorhal::{ + display, qr, time, + uzlib::{UzlibContext, UZLIB_WINDOW_SIZE}, + }, ui::lerp::Lerp, }; use core::slice; -use super::geometry::{Offset, Point, Rect}; - pub fn backlight() -> i32 { display::backlight(-1) } @@ -110,7 +114,9 @@ pub fn icon_rust(center: Point, data: &[u8], fg_color: Color, bg_color: Color) { set_window(clamped); let mut dest = [0_u8; 1]; - let mut ctx = uzlib::UzlibContext::new(&data[12..], true); + + let mut window = [0; UZLIB_WINDOW_SIZE]; + let mut ctx = UzlibContext::new(&data[12..], Some(&mut window)); for py in area.y0..area.y1 { for px in area.x0..area.x1 { @@ -317,7 +323,7 @@ pub fn rect_rounded2_partial( ); icon_area_clamped = icon_area.clamp(constant::screen()); - let mut ctx = uzlib::UzlibContext::new(&icon_bytes[12..], false); + let mut ctx = UzlibContext::new(&icon_bytes[12..], None); unwrap!(ctx.uncompress(&mut icon_data), "Decompression failed"); icon_colortable = get_color_table(icon_color, bg_color); icon_width = toif_info.width.into();