Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Bad cstr passed into pcap_compile_nopcap #8174

Merged
merged 1 commit into from
Sep 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 34 additions & 9 deletions agent/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 6 additions & 15 deletions agent/src/common/meta_packet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -934,12 +934,10 @@ impl<'a> MetaPacket<'a> {
let cap_len = data.cap_len as usize;

packet.raw_from_ebpf = vec![0u8; cap_len as usize];
#[cfg(target_arch = "aarch64")]
data.cap_data
.copy_to_nonoverlapping(packet.raw_from_ebpf.as_mut_ptr() as *mut u8, cap_len);
#[cfg(target_arch = "x86_64")]
data.cap_data
.copy_to_nonoverlapping(packet.raw_from_ebpf.as_mut_ptr() as *mut i8, cap_len);
data.cap_data.copy_to_nonoverlapping(
packet.raw_from_ebpf.as_mut_ptr() as *mut libc::c_char,
cap_len,
);
packet.packet_len = data.syscall_len as u32 + 54; // 目前仅支持TCP
packet.payload_len = data.cap_len as u16;
packet.l4_payload_len = data.cap_len as u16;
Expand All @@ -951,16 +949,9 @@ impl<'a> MetaPacket<'a> {
packet.coroutine_id = data.coroutine_id;
packet.syscall_trace_id = data.syscall_trace_id_call;
packet.socket_role = data.socket_role;
#[cfg(target_arch = "aarch64")]
ptr::copy(
data.process_kname.as_ptr() as *const u8,
packet.process_kname.as_mut_ptr() as *mut u8,
PACKET_KNAME_MAX_PADDING,
);
#[cfg(target_arch = "x86_64")]
ptr::copy(
data.process_kname.as_ptr() as *const i8,
packet.process_kname.as_mut_ptr() as *mut i8,
data.process_kname.as_ptr() as *const libc::c_char,
packet.process_kname.as_mut_ptr() as *mut libc::c_char,
PACKET_KNAME_MAX_PADDING,
);
packet.socket_id = data.socket_id;
Expand Down
6 changes: 1 addition & 5 deletions agent/src/common/proc_event/linux.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,12 +150,8 @@ impl ProcEvent {
let data = &mut data.read_unaligned();
let cap_len = data.cap_len as usize;
let mut raw_data = vec![0u8; cap_len as usize]; // Copy from data.cap_data where stores event's data
#[cfg(target_arch = "aarch64")]
data.cap_data
.copy_to_nonoverlapping(raw_data.as_mut_ptr() as *mut u8, cap_len);
#[cfg(target_arch = "x86_64")]
data.cap_data
.copy_to_nonoverlapping(raw_data.as_mut_ptr() as *mut i8, cap_len);
.copy_to_nonoverlapping(raw_data.as_mut_ptr() as *mut libc::c_char, cap_len);

let mut event_data: EventData = EventData::OtherEvent;
let start_time = data.timestamp * 1000; // The unit of data.timestamp is microsecond, and the unit of start_time is nanosecond
Expand Down
15 changes: 4 additions & 11 deletions agent/src/dispatcher/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -442,21 +442,14 @@ impl BpfOptions {
bf_insns: std::ptr::null_mut(),
};
unsafe {
#[cfg(target_arch = "x86_64")]
let ret = pcap_sys::pcap_compile_nopcap(
0xffff as libc::c_int,
1,
&mut prog,
self.capture_bpf.as_ptr() as *const i8,
1,
0xffffffff,
);
#[cfg(target_arch = "aarch64")]
let ret = pcap_sys::pcap_compile_nopcap(
0xffff as libc::c_int,
1,
&mut prog,
self.capture_bpf.as_ptr() as *const u8,
std::ffi::CString::new(self.capture_bpf.clone())
.unwrap()
.as_c_str()
.as_ptr() as *const libc::c_char,
1,
0xffffffff,
);
Expand Down
13 changes: 2 additions & 11 deletions agent/src/ebpf/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -260,13 +260,7 @@ impl fmt::Display for SK_BPF_DATA {
(self.tuple.rport, self.tuple.lport)
};
unsafe {
#[cfg(target_arch = "aarch64")]
let process_kname = CStr::from_ptr(self.process_kname.as_ptr() as *const u8)
.to_str()
.unwrap();

#[cfg(target_arch = "x86_64")]
let process_kname = CStr::from_ptr(self.process_kname.as_ptr() as *const i8)
let process_kname = CStr::from_ptr(self.process_kname.as_ptr() as *const c_char)
.to_str()
.unwrap();

Expand Down Expand Up @@ -450,10 +444,7 @@ extern "C" {
// is_stdout 日志是否输出到标准输出,true 写到标准输出,false 不写到标准输出。
// 返回值:
// 成功返回0,否则返回非0
#[cfg(target_arch = "x86_64")]
pub fn bpf_tracer_init(log_file: *const i8, is_stdout: bool) -> c_int;
#[cfg(target_arch = "aarch64")]
pub fn bpf_tracer_init(log_file: *const u8, is_stdout: bool) -> c_int;
pub fn bpf_tracer_init(log_file: *const c_char, is_stdout: bool) -> c_int;

// 所有tracer启动完毕后,最后显示调用bpf_tracer_finish()来通知主程序
pub fn bpf_tracer_finish();
Expand Down
Loading