Rollup merge of #141239 - RalfJung:dladdr-fname, r=Noratrieb
dladdr cannot leave dli_fname to be null There are two places in the repo calling `dladdr`, and they are inconsistent wrt their assumption of whether the `dli_fname` field can be null. Let's make them consistent. I see nothing in the docs that allows it to be null, but just to be on the safe side let's make this an assertion so hopefully we get a report if that ever happens.
This commit is contained in:
@@ -82,9 +82,7 @@ fn current_dll_path() -> Result<PathBuf, String> {
|
|||||||
let fname_ptr = info.dli_fname.as_ptr();
|
let fname_ptr = info.dli_fname.as_ptr();
|
||||||
#[cfg(not(target_os = "cygwin"))]
|
#[cfg(not(target_os = "cygwin"))]
|
||||||
let fname_ptr = {
|
let fname_ptr = {
|
||||||
if info.dli_fname.is_null() {
|
assert!(!info.dli_fname.is_null(), "the docs do not allow dladdr to be null");
|
||||||
return Err("dladdr returned null pointer".into());
|
|
||||||
}
|
|
||||||
info.dli_fname
|
info.dli_fname
|
||||||
};
|
};
|
||||||
let bytes = CStr::from_ptr(fname_ptr).to_bytes();
|
let bytes = CStr::from_ptr(fname_ptr).to_bytes();
|
||||||
|
|||||||
@@ -92,8 +92,7 @@ trait EvalContextExtPriv<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||||||
fn get_func_ptr_explicitly_from_lib(&mut self, link_name: Symbol) -> Option<CodePtr> {
|
fn get_func_ptr_explicitly_from_lib(&mut self, link_name: Symbol) -> Option<CodePtr> {
|
||||||
let this = self.eval_context_mut();
|
let this = self.eval_context_mut();
|
||||||
// Try getting the function from the shared library.
|
// Try getting the function from the shared library.
|
||||||
// On windows `_lib_path` will be unused, hence the name starting with `_`.
|
let (lib, lib_path) = this.machine.native_lib.as_ref().unwrap();
|
||||||
let (lib, _lib_path) = this.machine.native_lib.as_ref().unwrap();
|
|
||||||
let func: libloading::Symbol<'_, unsafe extern "C" fn()> = unsafe {
|
let func: libloading::Symbol<'_, unsafe extern "C" fn()> = unsafe {
|
||||||
match lib.get(link_name.as_str().as_bytes()) {
|
match lib.get(link_name.as_str().as_bytes()) {
|
||||||
Ok(x) => x,
|
Ok(x) => x,
|
||||||
@@ -114,7 +113,7 @@ trait EvalContextExtPriv<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||||||
// This code is a reimplementation of the mechanism for getting `dli_fname` in `libloading`,
|
// This code is a reimplementation of the mechanism for getting `dli_fname` in `libloading`,
|
||||||
// from: https://docs.rs/libloading/0.7.3/src/libloading/os/unix/mod.rs.html#411
|
// from: https://docs.rs/libloading/0.7.3/src/libloading/os/unix/mod.rs.html#411
|
||||||
// using the `libc` crate where this interface is public.
|
// using the `libc` crate where this interface is public.
|
||||||
let mut info = std::mem::MaybeUninit::<libc::Dl_info>::uninit();
|
let mut info = std::mem::MaybeUninit::<libc::Dl_info>::zeroed();
|
||||||
unsafe {
|
unsafe {
|
||||||
if libc::dladdr(*func.deref() as *const _, info.as_mut_ptr()) != 0 {
|
if libc::dladdr(*func.deref() as *const _, info.as_mut_ptr()) != 0 {
|
||||||
let info = info.assume_init();
|
let info = info.assume_init();
|
||||||
@@ -122,8 +121,9 @@ trait EvalContextExtPriv<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||||||
let fname_ptr = info.dli_fname.as_ptr();
|
let fname_ptr = info.dli_fname.as_ptr();
|
||||||
#[cfg(not(target_os = "cygwin"))]
|
#[cfg(not(target_os = "cygwin"))]
|
||||||
let fname_ptr = info.dli_fname;
|
let fname_ptr = info.dli_fname;
|
||||||
|
assert!(!fname_ptr.is_null());
|
||||||
if std::ffi::CStr::from_ptr(fname_ptr).to_str().unwrap()
|
if std::ffi::CStr::from_ptr(fname_ptr).to_str().unwrap()
|
||||||
!= _lib_path.to_str().unwrap()
|
!= lib_path.to_str().unwrap()
|
||||||
{
|
{
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user