--- a/bindings/jsonnet/src/import.rs +++ b/bindings/jsonnet/src/import.rs @@ -1,6 +1,7 @@ //! Import resolution manipulation utilities use std::{ + alloc::Layout, any::Any, cell::RefCell, collections::HashMap, @@ -25,8 +26,9 @@ base: *const c_char, rel: *const c_char, found_here: *mut *const c_char, - success: &mut c_int, -) -> *mut c_char; + buf: *mut *mut c_char, + buflen: *mut usize, +) -> c_int; /// Resolves imports using callback #[derive(Trace)] @@ -53,22 +55,31 @@ let base = unsafe { crate::unparse_path(&base) }; let rel = CString::new(path).unwrap(); let found_here: *mut c_char = null_mut(); - let mut success: i32 = 0; - let result_ptr = unsafe { + + let mut buf = null_mut(); + let mut buf_len = 0; + let success = unsafe { (self.cb)( self.ctx, base.as_ptr(), rel.as_ptr(), &mut (found_here as *const _), - &mut success, + &mut buf, + &mut buf_len, ) }; - let result_raw = unsafe { CStr::from_ptr(result_ptr) }; - let result_str = result_raw.to_str().unwrap(); + let buf_slice: &[u8] = unsafe { std::slice::from_raw_parts(buf.cast(), buf_len) }; + unsafe { + std::alloc::dealloc( + buf.cast(), + Layout::from_size_align(buf_len, 1).expect("layout is valid"), + ); + }; + let buf_intern = buf_slice.to_vec(); + assert!(success == 0 || success == 1); if success == 0 { - unsafe { CString::from_raw(result_ptr) }; - let result = result_str.to_owned(); + let result = String::from_utf8(buf_intern).expect("error should be valid string"); throw!(ImportCallbackError(result)); } @@ -82,8 +93,7 @@ let mut out = self.out.borrow_mut(); if !out.contains_key(&found_here_buf) { - out.insert(found_here_buf.clone(), result_str.into()); - unsafe { CString::from_raw(result_ptr) }; + out.insert(found_here_buf.clone(), buf_intern); } Ok(found_here_buf) --- a/bindings/jsonnet/src/lib.rs +++ b/bindings/jsonnet/src/lib.rs @@ -40,7 +40,7 @@ /// then there is a mismatch between header and compiled library. #[no_mangle] pub extern "C" fn jsonnet_version() -> &'static [u8; 8] { - b"v0.16.0\0" + b"v0.19.1\0" } unsafe fn parse_path(input: &CStr) -> Cow {