mirror of
https://github.com/checkpoint-restore/criu
synced 2025-09-01 14:55:39 +00:00
ns: Add ns_get_userns() feature
Check for NS_GET_USERNS nsfs ioctl(). Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
This commit is contained in:
committed by
Andrei Vagin
parent
c739646659
commit
10ed43f2d5
@@ -1084,6 +1084,17 @@ static int check_ns_pid(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int check_ns_get_userns(void)
|
||||||
|
{
|
||||||
|
if (kerndat_has_ns_get_userns() < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (!kdat.has_ns_get_userns)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int (*chk_feature)(void);
|
static int (*chk_feature)(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1192,6 +1203,7 @@ int cr_check(void)
|
|||||||
ret |= check_uffd_noncoop();
|
ret |= check_uffd_noncoop();
|
||||||
ret |= check_sk_netns();
|
ret |= check_sk_netns();
|
||||||
ret |= check_ns_pid();
|
ret |= check_ns_pid();
|
||||||
|
ret |= check_ns_get_userns();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1274,6 +1286,7 @@ static struct feature_list feature_list[] = {
|
|||||||
{ "nsid", check_nsid },
|
{ "nsid", check_nsid },
|
||||||
{ "link_nsid", check_link_nsid},
|
{ "link_nsid", check_link_nsid},
|
||||||
{ "ns_pid", check_ns_pid},
|
{ "ns_pid", check_ns_pid},
|
||||||
|
{ "ns_get_userns", check_ns_get_userns },
|
||||||
{ NULL, NULL },
|
{ NULL, NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -67,6 +67,7 @@ struct kerndat_s {
|
|||||||
bool has_nsid;
|
bool has_nsid;
|
||||||
bool has_link_nsid;
|
bool has_link_nsid;
|
||||||
bool has_nspid;
|
bool has_nspid;
|
||||||
|
bool has_ns_get_userns;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct kerndat_s kdat;
|
extern struct kerndat_s kdat;
|
||||||
@@ -90,5 +91,6 @@ extern int kerndat_fs_virtualized(unsigned int which, u32 kdev);
|
|||||||
extern int kerndat_tcp_repair();
|
extern int kerndat_tcp_repair();
|
||||||
extern int kerndat_uffd(void);
|
extern int kerndat_uffd(void);
|
||||||
extern int kerndat_has_nspid(void);
|
extern int kerndat_has_nspid(void);
|
||||||
|
extern int kerndat_has_ns_get_userns(void);
|
||||||
|
|
||||||
#endif /* __CR_KERNDAT_H__ */
|
#endif /* __CR_KERNDAT_H__ */
|
||||||
|
@@ -669,6 +669,26 @@ err:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int kerndat_has_ns_get_userns(void)
|
||||||
|
{
|
||||||
|
int pid_fd, user_fd;
|
||||||
|
|
||||||
|
pid_fd = open("/proc/self/ns/pid", O_RDONLY);
|
||||||
|
if (pid_fd < 0) {
|
||||||
|
perror("Can't open pid ns");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
user_fd = ioctl(pid_fd, NS_GET_USERNS);
|
||||||
|
if (user_fd >= 0) {
|
||||||
|
kdat.has_ns_get_userns = true;
|
||||||
|
close(user_fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
close(pid_fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#define KERNDAT_CACHE_FILE KDAT_RUNDIR"/criu.kdat"
|
#define KERNDAT_CACHE_FILE KDAT_RUNDIR"/criu.kdat"
|
||||||
#define KERNDAT_CACHE_FILE_TMP KDAT_RUNDIR"/.criu.kdat"
|
#define KERNDAT_CACHE_FILE_TMP KDAT_RUNDIR"/.criu.kdat"
|
||||||
|
|
||||||
@@ -926,12 +946,10 @@ int kerndat_init(void)
|
|||||||
/* Depends on kerndat_vdso_fill_symtable() */
|
/* Depends on kerndat_vdso_fill_symtable() */
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = kerndat_vdso_preserves_hint();
|
ret = kerndat_vdso_preserves_hint();
|
||||||
if (!ret)
|
|
||||||
ret = kerndat_socket_netns();
|
|
||||||
if (!ret)
|
|
||||||
ret = kerndat_nsid();
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = kerndat_has_nspid();
|
ret = kerndat_has_nspid();
|
||||||
|
if (!ret)
|
||||||
|
ret = kerndat_has_ns_get_userns();
|
||||||
|
|
||||||
kerndat_lsm();
|
kerndat_lsm();
|
||||||
kerndat_mmap_min_addr();
|
kerndat_mmap_min_addr();
|
||||||
|
Reference in New Issue
Block a user