From a5680056ce5eaa0da970da81dc611a999cd38811 Mon Sep 17 00:00:00 2001 From: Maximiato Date: Wed, 26 Sep 2018 20:57:34 -0700 Subject: [PATCH] Issue #10 -- unix lib.rs passes non zero terminated strings to dlopen Converting to CString type before passing as a C pointer to dlopen added the \0 termination and obviates one of the casts. Tests would fail if the same rigor was applied to dlsym because optional \0 termination is used as a feature (see example calls of find_func() in lib_impl/lib.rs). --- src/os/unix/lib.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/os/unix/lib.rs b/src/os/unix/lib.rs index d050e45ec..173c03e3a 100755 --- a/src/os/unix/lib.rs +++ b/src/os/unix/lib.rs @@ -3,6 +3,7 @@ use os::unix::external; use os::unix::OkOrDlerror; use os::unix::RTLD_LAZY; use util; +use std::ffi::CString; use std::mem; use std::path::Path; use std::os::raw::c_char; @@ -16,15 +17,13 @@ pub struct Lib { impl Lib { pub unsafe fn new(path_to_lib: TPath) -> Result where TPath: AsRef { - let path_to_lib_str = - path_to_lib - .as_ref() - .to_string_lossy(); - let path_to_lib_c_str = path_to_lib_str.as_ptr() as *const c_char; + let path_to_lib_c_str = CString::new(path_to_lib.as_ref().to_string_lossy().as_ref()) + .chain_err( || ErrorKind::LibraryOpen(path_to_lib.as_ref().to_path_buf()))?; + let path_to_lib_c_ptr = path_to_lib_c_str.as_ptr(); util::error_guard( || { - let result = external::dlopen(path_to_lib_c_str, RTLD_LAZY); + let result = external::dlopen(path_to_lib_c_ptr, RTLD_LAZY); if result.is_null() { None