about summary refs log tree commit diff
diff options
context:
space:
mode:
authorKai Luo <lkail@cn.ibm.com>2023-03-24 10:25:52 +0800
committerKai Luo <lkail@cn.ibm.com>2023-03-24 10:25:52 +0800
commit5aad51098d4bae73220aa58180cf562bccc4a213 (patch)
tree59cecf0ef7398e4bcc9eecefc31462a731f433dc
parent6e8a8282b8c131adb7f39909b9148687ea6c3b7b (diff)
downloadrust-5aad51098d4bae73220aa58180cf562bccc4a213.tar.gz
rust-5aad51098d4bae73220aa58180cf562bccc4a213.zip
Avoid misalign
-rw-r--r--compiler/rustc_session/src/filesearch.rs11
1 files changed, 8 insertions, 3 deletions
diff --git a/compiler/rustc_session/src/filesearch.rs b/compiler/rustc_session/src/filesearch.rs
index 2c804f0f0a4..9c8a28a4a7e 100644
--- a/compiler/rustc_session/src/filesearch.rs
+++ b/compiler/rustc_session/src/filesearch.rs
@@ -85,15 +85,20 @@ fn current_dll_path() -> Result<PathBuf, String> {
     #[cfg(target_os = "aix")]
     unsafe {
         let addr = current_dll_path as u64;
-        let mut buffer = vec![0i8; 4096];
+        let mut buffer = vec![std::mem::zeroed::<libc::ld_info>(); 64];
         loop {
-            if libc::loadquery(libc::L_GETINFO, buffer.as_mut_ptr(), buffer.len() as u32) >= 0 {
+            if libc::loadquery(
+                libc::L_GETINFO,
+                buffer.as_mut_ptr() as *mut i8,
+                (std::mem::size_of::<libc::ld_info>() * buffer.len()) as u32,
+            ) >= 0
+            {
                 break;
             } else {
                 if std::io::Error::last_os_error().raw_os_error().unwrap() != libc::ENOMEM {
                     return Err("loadquery failed".into());
                 }
-                buffer.resize(buffer.len() * 2, 0i8);
+                buffer.resize(buffer.len() * 2, std::mem::zeroed::<libc::ld_info>());
             }
         }
         let mut current = buffer.as_mut_ptr() as *mut libc::ld_info;