From 700e5fff8b40ca228a5d45a8f0116ec68636ab80 Mon Sep 17 00:00:00 2001 From: lurchi Date: Wed, 7 Sep 2016 15:14:35 +0200 Subject: [PATCH] slice::from_raw_parts must not be called on null pointer --- rust/src/packet_types.rs | 20 ++++++++++---------- rust/src/parser.rs | 9 ++++++--- rust/src/util.rs | 14 ++++++++++++-- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/rust/src/packet_types.rs b/rust/src/packet_types.rs index a316609..3ab9d11 100644 --- a/rust/src/packet_types.rs +++ b/rust/src/packet_types.rs @@ -33,6 +33,16 @@ pub enum PsycPacketFlag { PSYC_PACKET_NO_LENGTH = 2, } +#[repr(C)] +pub enum PsycPacketId { + PSYC_PACKET_ID_CONTEXT = 0, + PSYC_PACKET_ID_SOURCE = 1, + PSYC_PACKET_ID_TARGET = 2, + PSYC_PACKET_ID_COUNTER = 3, + PSYC_PACKET_ID_FRAGMENT = 4, + PSYC_PACKET_ID_ELEMS = 5, +} + #[derive(Copy, Clone)] #[repr(C)] pub enum PsycOperator { @@ -51,16 +61,6 @@ pub enum PsycStateOp { PSYC_STATE_RESYNC = '?' as _, } -#[repr(C)] -pub enum PsycPacketId { - PSYC_PACKET_ID_CONTEXT = 0, - PSYC_PACKET_ID_SOURCE = 1, - PSYC_PACKET_ID_TARGET = 2, - PSYC_PACKET_ID_COUNTER = 3, - PSYC_PACKET_ID_FRAGMENT = 4, - PSYC_PACKET_ID_ELEMS = 5, -} - #[repr(C)] pub struct PsycElem { pub elem_type: PsycString, diff --git a/rust/src/parser.rs b/rust/src/parser.rs index ffe3963..eba4a5c 100644 --- a/rust/src/parser.rs +++ b/rust/src/parser.rs @@ -300,21 +300,24 @@ impl PsycListParser { PsycParseListRC::PSYC_PARSE_LIST_ELEM_START => { let result = PsycListParserResult::ListElementStart { - value_part: util::cstring_to_slice(element.data, element.length) + value_part: util::cstring_to_slice(element.data, + element.length) }; return Ok(result) }, PsycParseListRC::PSYC_PARSE_LIST_ELEM_CONT => { let result = PsycListParserResult::ListElementCont { - value_part: util::cstring_to_slice(element.data, element.length) + value_part: util::cstring_to_slice(element.data, + element.length) }; return Ok(result) }, PsycParseListRC::PSYC_PARSE_LIST_ELEM_END => { let result = PsycListParserResult::ListElementEnd { - value_part: util::cstring_to_slice(element.data, element.length) + value_part: util::cstring_to_slice(element.data, + element.length) }; return Ok(result) }, diff --git a/rust/src/util.rs b/rust/src/util.rs index e40f84c..3cd4fcb 100644 --- a/rust/src/util.rs +++ b/rust/src/util.rs @@ -1,13 +1,23 @@ use packet_types::{RawPsycList, PsycRenderRC}; use std::slice; use std::os::raw::c_char; +use std::str; extern "C" { fn psyc_render_list(list: *const RawPsycList, buffer: *mut c_char, buflen: usize) -> PsycRenderRC; } -pub unsafe fn cstring_to_slice<'a>(cstring: *const c_char, length: usize) -> &'a[u8] { - slice::from_raw_parts(cstring as *const u8, length) +pub unsafe fn cstring_to_slice<'a>(cstring: *const c_char, length: usize) + -> &'a[u8] { + match cstring { + p if p.is_null() => &[], + _ => slice::from_raw_parts(cstring as *const u8, length) + } +} + +pub unsafe fn cstring_to_str<'a>(cstring: *const c_char, length: usize) + -> &'a str { + str::from_utf8_unchecked(cstring_to_slice(cstring, length)) } pub unsafe fn render_list(list: &RawPsycList) -> Vec {