Skip to content

Commit 7ddafb1

Browse files
add MFD_EXEC and MFD_NOEXEC_SEAL flag to memfd_create
Signed-off-by: DreamConnected <1487442471@qq.com> Co-Authored-By: Danny Lin <danny@kdrag0n.dev>
1 parent cc52680 commit 7ddafb1

5 files changed

Lines changed: 49 additions & 5 deletions

File tree

src/lxc/conf.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2606,7 +2606,13 @@ FILE *make_anonymous_mount_file(const struct list_head *mount_entries,
26062606
int ret;
26072607
struct string_entry *entry;
26082608

2609-
fd = memfd_create(".lxc_mount_file", MFD_CLOEXEC);
2609+
fd = memfd_create(".lxc_mount_file", MFD_CLOEXEC | MFD_NOEXEC_SEAL);
2610+
2611+
if (fd < 0 && errno == EINVAL) {
2612+
TRACE("MFD_NOEXEC_SEAL may unsupported, using MFD_CLOEXEC only");
2613+
fd = memfd_create(".lxc_mount_file", MFD_CLOEXEC);
2614+
}
2615+
26102616
if (fd < 0) {
26112617
char template[] = P_tmpdir "/.lxc_mount_file_XXXXXX";
26122618

@@ -3389,7 +3395,13 @@ static void turn_into_dependent_mounts(const struct lxc_rootfs *rootfs)
33893395
return;
33903396
}
33913397

3392-
memfd = memfd_create(".lxc_mountinfo", MFD_CLOEXEC);
3398+
memfd = memfd_create(".lxc_mountinfo", MFD_CLOEXEC | MFD_NOEXEC_SEAL);
3399+
3400+
if (memfd < 0 && errno == EINVAL) {
3401+
TRACE("MFD_NOEXEC_SEAL may unsupported, using MFD_CLOEXEC only");
3402+
memfd = memfd_create(".lxc_mountinfo", MFD_CLOEXEC);
3403+
}
3404+
33933405
if (memfd < 0) {
33943406
char template[] = P_tmpdir "/.lxc_mountinfo_XXXXXX";
33953407

src/lxc/macro.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,14 @@
401401
#define MFD_ALLOW_SEALING 0x0002U
402402
#endif
403403

404+
#ifndef MFD_NOEXEC_SEAL
405+
#define MFD_NOEXEC_SEAL 0x0008U
406+
#endif
407+
408+
#ifndef MFD_EXEC
409+
#define MFD_EXEC 0x0010U
410+
#endif
411+
404412
/**
405413
* BUILD_BUG_ON - break compile if a condition is true.
406414
* @condition: the condition which the compiler should know is false.

src/lxc/parse.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,13 @@ int lxc_file_for_each_line_mmap(const char *file, lxc_file_cb callback, void *da
5656
ssize_t bytes;
5757
char *line;
5858

59-
memfd = memfd_create(".lxc_config_file", MFD_CLOEXEC);
59+
memfd = memfd_create(".lxc_config_file", MFD_CLOEXEC | MFD_NOEXEC_SEAL);
60+
61+
if (memfd < 0 && errno == EINVAL) {
62+
TRACE("MFD_NOEXEC_SEAL may unsupported, using MFD_CLOEXEC only");
63+
memfd = memfd_create(".lxc_config_file", MFD_CLOEXEC);
64+
}
65+
6066
if (memfd < 0) {
6167
char template[] = P_tmpdir "/.lxc_config_file_XXXXXX";
6268

src/lxc/rexec.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
#include "rexec.h"
1616
#include "string_utils.h"
1717
#include "syscall_wrappers.h"
18+
#include "log.h"
19+
20+
lxc_log_define(rexec, lxc);
1821

1922
#define LXC_MEMFD_REXEC_SEALS \
2023
(F_SEAL_SEAL | F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_WRITE)
@@ -102,7 +105,13 @@ static void lxc_rexec_as_memfd(char **argv, char **envp, const char *memfd_name)
102105
struct stat st = {0};
103106
#endif
104107

105-
memfd = memfd_create(memfd_name, MFD_ALLOW_SEALING | MFD_CLOEXEC);
108+
memfd = memfd_create(memfd_name, MFD_ALLOW_SEALING | MFD_CLOEXEC | MFD_EXEC);
109+
110+
if (memfd < 0 && errno == EINVAL) {
111+
TRACE("MFD_EXEC may unsupported, using MFD_ALLOW_SEALING and MFD_CLOEXEC");
112+
memfd = memfd_create(memfd_name, MFD_ALLOW_SEALING | MFD_CLOEXEC);
113+
}
114+
106115
if (memfd < 0) {
107116
char template[PATH_MAX];
108117

src/lxc/ringbuf.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@
1111
#include <sys/mman.h>
1212
#include <unistd.h>
1313

14+
#include "log.h"
1415
#include "ringbuf.h"
1516
#include "syscall_wrappers.h"
1617
#include "utils.h"
1718

19+
lxc_log_define(ringbuf, lxc);
20+
1821
int lxc_ringbuf_create(struct lxc_ringbuf *buf, size_t size)
1922
{
2023
__do_close int memfd = -EBADF;
@@ -34,7 +37,13 @@ int lxc_ringbuf_create(struct lxc_ringbuf *buf, size_t size)
3437
if (buf->addr == MAP_FAILED)
3538
return -EINVAL;
3639

37-
memfd = memfd_create(".lxc_ringbuf", MFD_CLOEXEC);
40+
memfd = memfd_create(".lxc_ringbuf", MFD_CLOEXEC | MFD_NOEXEC_SEAL);
41+
42+
if (memfd < 0 && errno == EINVAL) {
43+
TRACE("MFD_NOEXEC_SEAL may unsupported, using MFD_CLOEXEC only");
44+
memfd = memfd_create(".lxc_ringbuf", MFD_CLOEXEC);
45+
}
46+
3847
if (memfd < 0) {
3948
char template[] = P_tmpdir "/.lxc_ringbuf_XXXXXX";
4049

0 commit comments

Comments
 (0)