[CRIU] [PATCH v2 09/57] kerndat: Check that "/proc/[pid]/status" file has NS{pid, ..} lines
Kirill Tkhai
ktkhai at virtuozzo.com
Fri Apr 7 02:51:58 PDT 2017
On 07.04.2017 03:21, Andrei Vagin wrote:
> On Tue, Mar 28, 2017 at 06:35:32PM +0300, Kirill Tkhai wrote:
>> If there is nested pid_ns, we need to be able to get pid in
>> the whole pid hierarhy. This may be taken from "/proc/[pid]/status"
>> file only. Check, that kernel has support for it.
>
> Do we need to add a proper feature check
>
> criu check --feature nspid
Maybe, so let it be
>>
>> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
>> ---
>> criu/include/kerndat.h | 1 +
>> criu/kerndat.c | 28 ++++++++++++++++++++++++++++
>> criu/namespaces.c | 5 +++++
>> 3 files changed, 34 insertions(+)
>>
>> diff --git a/criu/include/kerndat.h b/criu/include/kerndat.h
>> index 60c69c3e..2e8c3309 100644
>> --- a/criu/include/kerndat.h
>> +++ b/criu/include/kerndat.h
>> @@ -43,6 +43,7 @@ struct kerndat_s {
>> unsigned long uffd_features;
>> bool has_nsid;
>> bool has_link_nsid;
>> + bool has_nspid;
>> };
>>
>> extern struct kerndat_s kdat;
>> diff --git a/criu/kerndat.c b/criu/kerndat.c
>> index 354c2a5f..df388c56 100644
>> --- a/criu/kerndat.c
>> +++ b/criu/kerndat.c
>> @@ -630,6 +630,32 @@ int kerndat_uffd(bool need_uffd)
>> return 0;
>> }
>>
>> +int kerndat_has_nspid(void)
>> +{
>> + struct bfd f;
>> + int ret = -1;
>> + char *str;
>> +
>> + f.fd = open("/proc/self/status", O_RDONLY);
>> + if (f.fd < 0) {
>> + pr_perror("Can't open /proc/self/status");
>> + return -1;
>> + }
>> + if (bfdopenr(&f))
>> + return -1;
>> + while ((str = breadline(&f)) != NULL) {
>> + if (IS_ERR(str))
>> + goto close;
>> + if (!strncmp(str, "NSpid:", 6)) {
>> + kdat.has_nspid = true;
>> + break;
>> + }
>> + }
>> + ret = 0;
>> +close:
>> + bclose(&f);
>> + return ret;
>> +}
>> int kerndat_init(void)
>> {
>> int ret;
>> @@ -661,6 +687,8 @@ int kerndat_init(void)
>> ret = kerndat_socket_netns();
>> if (!ret)
>> ret = kerndat_nsid();
>> + if (!ret)
>> + ret = kerndat_has_nspid();
>>
>> kerndat_lsm();
>> kerndat_mmap_min_addr();
>> diff --git a/criu/namespaces.c b/criu/namespaces.c
>> index 4ecd6e36..1dab7656 100644
>> --- a/criu/namespaces.c
>> +++ b/criu/namespaces.c
>> @@ -26,6 +26,7 @@
>> #include "namespaces.h"
>> #include "net.h"
>> #include "cgroup.h"
>> +#include "kerndat.h"
>>
>> #include "protobuf.h"
>> #include "util.h"
>> @@ -792,6 +793,10 @@ static int set_ns_hookups(struct ns_id *ns)
>> pr_err("Wrong determined NS_ROOT, or root_item has NS_OTHER user_ns\n");
>> goto out;
>> }
>> + if (nd == &pid_ns_desc && !kdat.has_nspid) {
>> + pr_err("Can't dump nested pid ns\n");
>> + goto out;
>> + }
>> list_add(&ns->siblings, &ns->parent->children);
>> }
>>
>>
More information about the CRIU
mailing list