From 147ef41fdf14190cc3d995a967d9c3ccde59ae2d Mon Sep 17 00:00:00 2001 From: Hieu Date: Thu, 2 Apr 2026 19:14:49 +0700 Subject: [PATCH 1/2] set expected_attach_type in from_pin for cgroup_sock, cgroup_sockopt, cgroup_sock_addr --- aya/src/programs/cgroup_sock.rs | 3 ++- aya/src/programs/cgroup_sock_addr.rs | 3 ++- aya/src/programs/cgroup_sockopt.rs | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/aya/src/programs/cgroup_sock.rs b/aya/src/programs/cgroup_sock.rs index b3d116f2e..4697780b3 100644 --- a/aya/src/programs/cgroup_sock.rs +++ b/aya/src/programs/cgroup_sock.rs @@ -115,7 +115,8 @@ impl CgroupSock { path: P, attach_type: CgroupSockAttachType, ) -> Result { - let data = ProgramData::from_pinned_path(path, VerifierLogLevel::default())?; + let mut data = ProgramData::from_pinned_path(path, VerifierLogLevel::default())?; + data.expected_attach_type = Some(attach_type.into()); Ok(Self { data, attach_type }) } } diff --git a/aya/src/programs/cgroup_sock_addr.rs b/aya/src/programs/cgroup_sock_addr.rs index 0be64cab2..e1dcf2a2f 100644 --- a/aya/src/programs/cgroup_sock_addr.rs +++ b/aya/src/programs/cgroup_sock_addr.rs @@ -116,7 +116,8 @@ impl CgroupSockAddr { path: P, attach_type: CgroupSockAddrAttachType, ) -> Result { - let data = ProgramData::from_pinned_path(path, VerifierLogLevel::default())?; + let mut data = ProgramData::from_pinned_path(path, VerifierLogLevel::default())?; + data.expected_attach_type = Some(attach_type.into()); Ok(Self { data, attach_type }) } } diff --git a/aya/src/programs/cgroup_sockopt.rs b/aya/src/programs/cgroup_sockopt.rs index 389c7d94f..7de7619e9 100644 --- a/aya/src/programs/cgroup_sockopt.rs +++ b/aya/src/programs/cgroup_sockopt.rs @@ -115,7 +115,8 @@ impl CgroupSockopt { path: P, attach_type: CgroupSockoptAttachType, ) -> Result { - let data = ProgramData::from_pinned_path(path, VerifierLogLevel::default())?; + let mut data = ProgramData::from_pinned_path(path, VerifierLogLevel::default())?; + data.expected_attach_type = Some(attach_type.into()); Ok(Self { data, attach_type }) } } From 7165c1c10600d597dacc6ab0498187172c148e06 Mon Sep 17 00:00:00 2001 From: Hieu Nguyen Date: Fri, 3 Apr 2026 23:11:31 +0700 Subject: [PATCH 2/2] test: add integration test for cgroup_sock_addr from_pin attach Adds a test that verifies CgroupSockAddr::from_pin() correctly sets expected_attach_type before attach() is called. Without the fix, attach() would panic with unwrap on None. Addresses maintainer request (tamird) for an integration test on PR #1516. --- test/integration-test/src/tests.rs | 1 + .../src/tests/cgroup_sock_pinned.rs | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 test/integration-test/src/tests/cgroup_sock_pinned.rs diff --git a/test/integration-test/src/tests.rs b/test/integration-test/src/tests.rs index 2ec08d5f5..646eb268c 100644 --- a/test/integration-test/src/tests.rs +++ b/test/integration-test/src/tests.rs @@ -13,6 +13,7 @@ mod bloom_filter; mod bpf_probe_read; mod btf_maps; mod btf_relocations; +mod cgroup_sock_pinned; mod elf; mod feature_probe; mod info; diff --git a/test/integration-test/src/tests/cgroup_sock_pinned.rs b/test/integration-test/src/tests/cgroup_sock_pinned.rs new file mode 100644 index 000000000..386af4e09 --- /dev/null +++ b/test/integration-test/src/tests/cgroup_sock_pinned.rs @@ -0,0 +1,50 @@ +use std::fs::remove_file; + +use aya::{ + maps::SkStorage, + programs::{CgroupAttachMode, CgroupSockAddr, CgroupSockAddrAttachType}, +}; +use test_log::test; + +use crate::utils::Cgroup; + +#[test] +fn cgroup_sock_addr_from_pin_attach() { + // Test that CgroupSockAddr::from_pin() correctly sets expected_attach_type, + // so that attach() does not panic. + let mut ebpf = aya::EbpfLoader::new().load(crate::SK_STORAGE).unwrap(); + + let storage = ebpf.take_map("SOCKET_STORAGE").unwrap(); + let _storage = + SkStorage::<_, integration_common::sk_storage::Value>::try_from(storage).unwrap(); + + let prog = ebpf + .program_mut("sk_storage_connect4") + .unwrap() + .try_into() + .unwrap(); + + let prog: &mut CgroupSockAddr = prog; + prog.load().unwrap(); + + // Pin the program to bpffs + let pin_path = "/sys/fs/bpf/aya-test-cgroup-sock-addr-from-pin"; + remove_file(pin_path).ok(); + prog.pin(pin_path).unwrap(); + + // Reload from pinned path via from_pin() - this is the critical path. + // Before the fix, expected_attach_type was not set in from_pin(), + // causing attach() to panic with unwrap on None. + let mut prog = CgroupSockAddr::from_pin(pin_path, CgroupSockAddrAttachType::Connect4).unwrap(); + + let root = Cgroup::root(); + let cgroup = root.create_child("aya-test-cgroup-sock-addr-from-pin"); + let cgroup_fd = cgroup.fd(); + + // This attach() would panic if expected_attach_type was not set by from_pin(). + let _link_id = prog.attach(cgroup_fd, CgroupAttachMode::Single).unwrap(); + + // Clean up + drop(cgroup); + remove_file(pin_path).ok(); +}