1
1
mirror of https://github.com/wez/wezterm.git synced 2024-11-22 04:56:12 +03:00

hbwrap: from_raw_parts handling of null ptr

use similar approach to 67d4ba9f76

closes: https://github.com/wez/wezterm/pull/6337
closes: https://github.com/wez/wezterm/issues/6336
This commit is contained in:
Wez Furlong 2024-10-30 21:52:16 -07:00
parent 6a0ed04df4
commit f847bd284d
No known key found for this signature in database
GPG Key ID: 7A7F66A31EC9B387

View File

@ -10,10 +10,10 @@ use cairo::Extend;
use memmap2::{Mmap, MmapOptions}; use memmap2::{Mmap, MmapOptions};
use std::ffi::CStr; use std::ffi::CStr;
use std::io::Read; use std::io::Read;
use std::mem;
use std::ops::Range; use std::ops::Range;
use std::os::raw::{c_char, c_int, c_uint, c_void}; use std::os::raw::{c_char, c_int, c_uint, c_void};
use std::sync::Arc; use std::sync::Arc;
use std::{mem, slice};
use wezterm_color_types::SrgbaPixel; use wezterm_color_types::SrgbaPixel;
extern "C" { extern "C" {
@ -79,7 +79,7 @@ impl Blob {
unsafe { unsafe {
let mut len = 0; let mut len = 0;
let ptr = hb_blob_get_data(self.blob, &mut len); let ptr = hb_blob_get_data(self.blob, &mut len);
std::slice::from_raw_parts(ptr as *const u8, len as usize) from_raw_parts(ptr as *const u8, len as usize)
} }
} }
@ -1056,7 +1056,7 @@ impl Buffer {
unsafe { unsafe {
let mut len: u32 = 0; let mut len: u32 = 0;
let info = hb_buffer_get_glyph_infos(self.buf, &mut len as *mut _); let info = hb_buffer_get_glyph_infos(self.buf, &mut len as *mut _);
slice::from_raw_parts(info, len as usize) from_raw_parts(info, len as usize)
} }
} }
@ -1066,7 +1066,7 @@ impl Buffer {
unsafe { unsafe {
let mut len: u32 = 0; let mut len: u32 = 0;
let pos = hb_buffer_get_glyph_positions(self.buf, &mut len as *mut _); let pos = hb_buffer_get_glyph_positions(self.buf, &mut len as *mut _);
slice::from_raw_parts(pos, len as usize) from_raw_parts(pos, len as usize)
} }
} }
@ -1180,3 +1180,16 @@ pub fn hb_tag_to_string(tag: hb_tag_t) -> TagString {
} }
TagString(buf) TagString(buf)
} }
/// Wrapper around std::slice::from_raw_parts that allows for ptr to be
/// null. In the null ptr case, an empty slice is returned.
/// This is necessary because harfbuzz may sometimes encode
/// empty arrays in that way, and rust 1.78 will panic if a null
/// ptr is passed in.
pub(crate) unsafe fn from_raw_parts<'a, T>(ptr: *const T, size: usize) -> &'a [T] {
if ptr.is_null() {
&[]
} else {
std::slice::from_raw_parts(ptr, size)
}
}