From 84ac59da1274568c23c6fa43be32197944b4962e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Mon, 22 Jul 2024 12:20:10 +0200 Subject: [PATCH 1/2] Kernel SDK/Mockup: fix #7378 This commit prevents the mocked implementation of the reveal_metadata host function from panicking when its max_bytes argument is too large. --- src/kernel_sdk/mock/src/host.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/kernel_sdk/mock/src/host.rs b/src/kernel_sdk/mock/src/host.rs index 6104c15f1ad2..56b0f9f2cf29 100644 --- a/src/kernel_sdk/mock/src/host.rs +++ b/src/kernel_sdk/mock/src/host.rs @@ -220,15 +220,13 @@ unsafe impl SmartRollupCore for MockHost { self.state.borrow().store.store_value_size(path, path_len) } - // TODO adapt reveal_metadata - // https://gitlab.com/tezos/tezos/-/issues/7378 unsafe fn reveal_metadata(&self, destination_addr: *mut u8, max_bytes: usize) -> i32 { - assert!(METADATA_SIZE <= max_bytes); let metadata: [u8; METADATA_SIZE] = self.state.borrow().get_metadata().clone().into(); - let slice = from_raw_parts_mut(destination_addr, metadata.len()); - slice.copy_from_slice(metadata.as_slice()); - metadata.len().try_into().unwrap() + let len = min(max_bytes, metadata.len()); + let slice = from_raw_parts_mut(destination_addr, len); + slice.copy_from_slice(&metadata[..len]); + len as i32 } // TODO turn payload.split_at into a read or error code helper function. -- GitLab From 0b93cd4de9648cbe7f2bcbf7f3362bfdbf6c63ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Mon, 22 Jul 2024 12:40:18 +0200 Subject: [PATCH 2/2] Kernel SDK/Mockup: fix #7377 When the lenght of the payload given to the mocked reveal host function is too short, the mocked reveal host function now returns 0 instead of panicking. --- src/kernel_sdk/mock/src/host.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/kernel_sdk/mock/src/host.rs b/src/kernel_sdk/mock/src/host.rs index 56b0f9f2cf29..9b74b49d3fd9 100644 --- a/src/kernel_sdk/mock/src/host.rs +++ b/src/kernel_sdk/mock/src/host.rs @@ -229,8 +229,6 @@ unsafe impl SmartRollupCore for MockHost { len as i32 } - // TODO turn payload.split_at into a read or error code helper function. - // https://gitlab.com/tezos/tezos/-/issues/7377 unsafe fn reveal( &self, payload_addr: *const u8, @@ -239,6 +237,9 @@ unsafe impl SmartRollupCore for MockHost { max_bytes: usize, ) -> i32 { let payload: &[u8] = from_raw_parts(payload_addr, payload_len); + if payload.is_empty() { + return 0; + } let (tag, payload) = payload.split_at(size_of::()); match tag[0] { 0 => { @@ -256,6 +257,13 @@ unsafe impl SmartRollupCore for MockHost { } 2 => { // Reveal_dal_page + + const PAYLOAD_SIZE: usize = + size_of::() + size_of::() + size_of::(); + if payload.len() < PAYLOAD_SIZE { + return 0; + } + let (published_level, remaining) = payload.split_at(size_of::()); let (slot_index, remaining) = remaining.split_at(size_of::()); let (page_index, _) = remaining.split_at(size_of::()); -- GitLab