Skip to content

Commit

Permalink
journald: make memfd_create syscall directly (#1912)
Browse files Browse the repository at this point in the history
Fixes #1879

## Motivation

`journald-tracing>=0.2.1` doesn't build with old glibc.

## Solution

Make the `memfd_create` syscall ourselves.

cc @lunaryorn @Ralith
  • Loading branch information
9999years authored and hawkw committed Feb 7, 2022
1 parent 3222527 commit 9834705
Showing 1 changed file with 17 additions and 1 deletion.
18 changes: 17 additions & 1 deletion tracing-journald/src/memfd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,30 @@ use std::os::raw::c_uint;
use std::os::unix::prelude::{FromRawFd, RawFd};

fn create(flags: c_uint) -> Result<File> {
let fd = unsafe { memfd_create("tracing-journald\0".as_ptr() as *const c_char, flags) };
let fd = memfd_create_syscall(flags);
if fd < 0 {
Err(Error::last_os_error())
} else {
Ok(unsafe { File::from_raw_fd(fd as RawFd) })
}
}

/// Make the `memfd_create` syscall ourself instead of going through `libc`;
/// `memfd_create` isn't supported on `glibc<2.27` so this allows us to
/// support old-but-still-used distros like Ubuntu Xenial, Debian Stretch,
/// RHEL 7, etc.
///
/// See: https://github.com/tokio-rs/tracing/issues/1879
fn memfd_create_syscall(flags: c_uint) -> i64 {
unsafe {
syscall(
SYS_memfd_create,
"tracing-journald\0".as_ptr() as *const c_char,
flags,
)
}
}

pub fn create_sealable() -> Result<File> {
create(MFD_ALLOW_SEALING | MFD_CLOEXEC)
}
Expand Down

0 comments on commit 9834705

Please sign in to comment.