Skip to content

Commit d105bf2

Browse files
d-e-s-odanielocfb
authored andcommitted
libbpf-cargo: Open skeleton without options by default
In the logic we generate for opening the skeleton, we unconditionally work with some bpf_object_open_opts object, even if the user did not customize anything. That's fine in principle, but it can trigger a bug when a old system libbpf is used and which violates its forward compatibility guarantees. With this change we work around the issue by invoking the bpf_object__open_skeleton() libbpf function with a NULL pointer if SkelBuilder::open() instead of SkelBuilder::open_opts() is being used. This is generally the common case and so we work around the underlying libbpf bug until fixed and new releases rolled out to various distributions. Closes: #927 Signed-off-by: Daniel Müller <[email protected]>
1 parent ccd2a34 commit d105bf2

File tree

2 files changed

+29
-13
lines changed

2 files changed

+29
-13
lines changed

libbpf-cargo/CHANGELOG.md

+7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
Unreleased
2+
----------
3+
- Adjusted skeleton generation code to work around `libbpf` forward
4+
compatibility issue when an old system `libbpf` is being used instead
5+
of the vendored copy
6+
7+
18
0.24.3
29
------
310
- Silenced possible `clippy` reported warnings in generated skeleton

libbpf-cargo/src/gen/mod.rs

+22-13
Original file line numberDiff line numberDiff line change
@@ -957,25 +957,16 @@ fn gen_skel_contents(_debug: bool, raw_obj_name: &str, obj_file_path: &Path) ->
957957
pub obj_builder: libbpf_rs::ObjectBuilder,
958958
}}
959959
960-
impl<'obj> SkelBuilder<'obj> for {name}SkelBuilder {{
961-
type Output = Open{name}Skel<'obj>;
962-
fn open(
960+
impl<'obj> {name}SkelBuilder {{
961+
fn open_opts_impl(
963962
self,
964-
object: &'obj mut std::mem::MaybeUninit<libbpf_rs::OpenObject>,
965-
) -> libbpf_rs::Result<Open{name}Skel<'obj>> {{
966-
let opts = unsafe {{ self.obj_builder.as_libbpf_object().as_ref() }};
967-
self.open_opts(*opts, object)
968-
}}
969-
970-
fn open_opts(
971-
self,
972-
open_opts: libbpf_sys::bpf_object_open_opts,
963+
open_opts: *const libbpf_sys::bpf_object_open_opts,
973964
object: &'obj mut std::mem::MaybeUninit<libbpf_rs::OpenObject>,
974965
) -> libbpf_rs::Result<Open{name}Skel<'obj>> {{
975966
let skel_config = build_skel_config()?;
976967
let skel_ptr = skel_config.as_libbpf_object();
977968
978-
let ret = unsafe {{ libbpf_sys::bpf_object__open_skeleton(skel_ptr.as_ptr(), &open_opts) }};
969+
let ret = unsafe {{ libbpf_sys::bpf_object__open_skeleton(skel_ptr.as_ptr(), open_opts) }};
979970
if ret != 0 {{
980971
return Err(libbpf_rs::Error::from_raw_os_error(-ret));
981972
}}
@@ -1008,6 +999,24 @@ fn gen_skel_contents(_debug: bool, raw_obj_name: &str, obj_file_path: &Path) ->
1008999
{struct_ops_init}
10091000
Ok(skel)
10101001
}}
1002+
}}
1003+
1004+
impl<'obj> SkelBuilder<'obj> for {name}SkelBuilder {{
1005+
type Output = Open{name}Skel<'obj>;
1006+
fn open(
1007+
self,
1008+
object: &'obj mut std::mem::MaybeUninit<libbpf_rs::OpenObject>,
1009+
) -> libbpf_rs::Result<Open{name}Skel<'obj>> {{
1010+
self.open_opts_impl(std::ptr::null(), object)
1011+
}}
1012+
1013+
fn open_opts(
1014+
self,
1015+
open_opts: libbpf_sys::bpf_object_open_opts,
1016+
object: &'obj mut std::mem::MaybeUninit<libbpf_rs::OpenObject>,
1017+
) -> libbpf_rs::Result<Open{name}Skel<'obj>> {{
1018+
self.open_opts_impl(&open_opts, object)
1019+
}}
10111020
10121021
fn object_builder(&self) -> &libbpf_rs::ObjectBuilder {{
10131022
&self.obj_builder

0 commit comments

Comments
 (0)