Browse Source

Merge pull request #398 from vadorovsky/fix-miri

Fix CI errors
Michal Rostecki 2 years ago
parent
commit
3f2f3a8be0

+ 24 - 0
aya/src/maps/hash_map/hash_map.rs

@@ -475,6 +475,10 @@ mod tests {
     }
 
     #[test]
+    // Syscall overrides are performing integer-to-pointer conversions, which
+    // should be done with `ptr::from_exposed_addr` in Rust nightly, but we have
+    // to support stable as well.
+    #[cfg_attr(miri, ignore)]
     fn test_keys() {
         override_syscall(|call| match call {
             Syscall::Bpf {
@@ -497,6 +501,10 @@ mod tests {
     }
 
     #[test]
+    // Syscall overrides are performing integer-to-pointer conversions, which
+    // should be done with `ptr::from_exposed_addr` in Rust nightly, but we have
+    // to support stable as well.
+    #[cfg_attr(miri, ignore)]
     fn test_keys_error() {
         override_syscall(|call| match call {
             Syscall::Bpf {
@@ -532,6 +540,10 @@ mod tests {
     }
 
     #[test]
+    // Syscall overrides are performing integer-to-pointer conversions, which
+    // should be done with `ptr::from_exposed_addr` in Rust nightly, but we have
+    // to support stable as well.
+    #[cfg_attr(miri, ignore)]
     fn test_iter() {
         override_syscall(|call| match call {
             Syscall::Bpf {
@@ -556,6 +568,10 @@ mod tests {
     }
 
     #[test]
+    // Syscall overrides are performing integer-to-pointer conversions, which
+    // should be done with `ptr::from_exposed_addr` in Rust nightly, but we have
+    // to support stable as well.
+    #[cfg_attr(miri, ignore)]
     fn test_iter_key_deleted() {
         override_syscall(|call| match call {
             Syscall::Bpf {
@@ -591,6 +607,10 @@ mod tests {
     }
 
     #[test]
+    // Syscall overrides are performing integer-to-pointer conversions, which
+    // should be done with `ptr::from_exposed_addr` in Rust nightly, but we have
+    // to support stable as well.
+    #[cfg_attr(miri, ignore)]
     fn test_iter_key_error() {
         override_syscall(|call| match call {
             Syscall::Bpf {
@@ -632,6 +652,10 @@ mod tests {
     }
 
     #[test]
+    // Syscall overrides are performing integer-to-pointer conversions, which
+    // should be done with `ptr::from_exposed_addr` in Rust nightly, but we have
+    // to support stable as well.
+    #[cfg_attr(miri, ignore)]
     fn test_iter_value_error() {
         override_syscall(|call| match call {
             Syscall::Bpf {

+ 6 - 6
aya/src/obj/btf/types.rs

@@ -894,12 +894,12 @@ unsafe fn read_array<T>(data: &[u8], len: usize) -> Result<Vec<T>, BtfError> {
     if mem::size_of::<T>() * len > data.len() {
         return Err(BtfError::InvalidTypeInfo);
     }
-
-    Ok((0..len)
-        .map(|i| {
-            ptr::read_unaligned::<T>((data.as_ptr() as usize + i * mem::size_of::<T>()) as *const T)
-        })
-        .collect::<Vec<T>>())
+    let data = &data[0..mem::size_of::<T>() * len];
+    let r = data
+        .chunks(mem::size_of::<T>())
+        .map(|chunk| ptr::read_unaligned(chunk.as_ptr() as *const T))
+        .collect();
+    Ok(r)
 }
 
 impl BtfType {

+ 3 - 8
aya/src/obj/mod.rs

@@ -1348,15 +1348,10 @@ pub(crate) fn copy_instructions(data: &[u8]) -> Result<Vec<bpf_insn>, ParseError
     if data.len() % mem::size_of::<bpf_insn>() > 0 {
         return Err(ParseError::InvalidProgramCode);
     }
-    let num_instructions = data.len() / mem::size_of::<bpf_insn>();
-    let instructions = (0..num_instructions)
-        .map(|i| unsafe {
-            ptr::read_unaligned(
-                (data.as_ptr() as usize + i * mem::size_of::<bpf_insn>()) as *const bpf_insn,
-            )
-        })
+    let instructions = data
+        .chunks_exact(mem::size_of::<bpf_insn>())
+        .map(|d| unsafe { ptr::read_unaligned(d.as_ptr() as *const bpf_insn) })
         .collect::<Vec<_>>();
-
     Ok(instructions)
 }
 

+ 0 - 47
test/integration-ebpf/src/bpf/multimap.bpf.c

@@ -1,47 +0,0 @@
-#include <linux/bpf.h>
-#include <bpf/bpf_helpers.h>
-
-const int XDP_ACTION_MAX = (XDP_TX + 1);
-
-struct datarec {
-	__u64 rx_packets;
-};
-
-// stats keyed by XDP Action
-struct bpf_map_def SEC("maps") xdp_stats_map = {
-	.type        = BPF_MAP_TYPE_ARRAY,
-	.key_size    = sizeof(__u32),
-	.value_size  = sizeof(struct datarec),
-	.max_entries = XDP_ACTION_MAX,
-};
-
-// tracks number of times called
-struct bpf_map_def SEC("maps") prog_stats_map = {
-	.type        = BPF_MAP_TYPE_ARRAY,
-	.key_size    = sizeof(__u32),
-	.value_size  = sizeof(__u64),
-	.max_entries = 1,
-};
-
-SEC("xdp/stats")
-int  xdp_stats(struct xdp_md *ctx)
-{
-    __u64 *stats;
-	struct datarec *rec;
-	__u32 key = XDP_PASS;
-	__u32 k1 = 0;
-
-    stats = bpf_map_lookup_elem(&prog_stats_map, &k1);
-    if (!stats)
-        return XDP_ABORTED;
-    __sync_fetch_and_add(stats, 1);
-
-	rec = bpf_map_lookup_elem(&xdp_stats_map, &key);
-	if (!rec)
-		return XDP_ABORTED;
-	__sync_fetch_and_add(&rec->rx_packets, 1);
-	
-	return XDP_PASS;
-}
-
-char _license[] SEC("license") = "GPL";

+ 0 - 11
test/integration-test/src/tests/load.rs

@@ -27,17 +27,6 @@ fn long_name() -> anyhow::Result<()> {
     Ok(())
 }
 
-#[integration_test]
-fn multiple_maps() -> anyhow::Result<()> {
-    let bytes =
-        include_bytes_aligned!("../../../../target/bpfel-unknown-none/debug/multimap.bpf.o");
-    let mut bpf = Bpf::load(bytes)?;
-    let pass: &mut Xdp = bpf.program_mut("stats").unwrap().try_into().unwrap();
-    pass.load().unwrap();
-    pass.attach("lo", XdpFlags::default()).unwrap();
-    Ok(())
-}
-
 #[integration_test]
 fn multiple_btf_maps() -> anyhow::Result<()> {
     let bytes =