From 74c6445cd09b4889a07124f456ebca49ae53f10e Mon Sep 17 00:00:00 2001 From: Stephan Renatus Date: Fri, 20 Dec 2019 16:29:44 +0100 Subject: [PATCH] Add function to get NULL-terminated strings from memory Fixes #1086. Signed-off-by: Stephan Renatus --- lib/runtime-core/src/memory/ptr.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/runtime-core/src/memory/ptr.rs b/lib/runtime-core/src/memory/ptr.rs index 5e31627c20f..c89001b235c 100644 --- a/lib/runtime-core/src/memory/ptr.rs +++ b/lib/runtime-core/src/memory/ptr.rs @@ -10,7 +10,7 @@ use crate::{ memory::Memory, types::{ValueType, WasmExternType}, }; -use std::{cell::Cell, fmt, marker::PhantomData, mem}; +use std::{cell::Cell, convert::TryInto, fmt, marker::PhantomData, mem}; /// Array. pub struct Array; @@ -137,6 +137,17 @@ impl WasmPtr { let slice: &[u8] = unsafe { std::slice::from_raw_parts(ptr, str_len as usize) }; std::str::from_utf8(slice).ok() } + + /// Get a UTF-8 string representation of this `WasmPtr`, where the string is NULL-terminated. + /// Note that this does not account for UTF-8 strings that _contain_ NULL themselves, + /// [`get_utf8_string`] has to be used for those. + pub fn get_utf8_string_nul_terminated<'a>(self, memory: &'a Memory) -> Option<&'a str> { + memory.view::()[(self.offset as usize)..] + .iter() + .map(|cell| cell.get()) + .position(|byte| byte == 0) + .and_then(|length| self.get_utf8_string(memory, length.try_into().unwrap())) + } } unsafe impl WasmExternType for WasmPtr {