diff --git a/arch/x86/syscall-x86-64.def b/arch/x86/syscall-x86-64.def index 70d707d93..4b138c60d 100644 --- a/arch/x86/syscall-x86-64.def +++ b/arch/x86/syscall-x86-64.def @@ -47,6 +47,7 @@ __NR_mkdir 83 sys_mkdir (const char *name, int mode) __NR_rmdir 84 sys_rmdir (const char *name) __NR_unlink 87 sys_unlink (char *pathname) __NR_readlink 89 sys_readlink (const char *path, char *buf, int bufsize) +__NR_umask 95 sys_umask (int mask) __NR_getgroups 115 sys_getgroups (int gsize, unsigned int *groups) __NR_setresuid 117 sys_setresuid (int uid, int euid, int suid) __NR_setresgid 119 sys_setresgid (int gid, int egid, int sgid) diff --git a/cr-dump.c b/cr-dump.c index afe010ef6..130f8854e 100644 --- a/cr-dump.c +++ b/cr-dump.c @@ -393,12 +393,15 @@ err: return ret; } -static int dump_task_fs(pid_t pid, struct cr_fdset *fdset) +static int dump_task_fs(pid_t pid, struct parasite_dump_misc *misc, struct cr_fdset *fdset) { struct fd_parms p = FD_PARMS_INIT; FsEntry fe = FS_ENTRY__INIT; int fd, ret; + fe.has_umask = true; + fe.umask = misc->umask; + fd = open_proc(pid, "cwd"); if (fd < 0) return -1; @@ -1460,7 +1463,7 @@ static int dump_one_task(struct pstree_item *item) goto err; } - ret = dump_task_fs(pid, cr_fdset); + ret = dump_task_fs(pid, &misc, cr_fdset); if (ret) { pr_err("Dump fs (pid: %d) failed with %d\n", pid, ret); goto err; diff --git a/files.c b/files.c index 5bf4ffac1..d59cee64c 100644 --- a/files.c +++ b/files.c @@ -599,6 +599,11 @@ int prepare_fs(int pid) * by path thus exposing this (yet unclean) logic here. */ + if (fe->has_umask) { + pr_info("Restoring umask to %o\n", fe->umask); + umask(fe->umask); + } + ret = 0; close: close_safe(&cwd); diff --git a/include/parasite.h b/include/parasite.h index 9918087d9..4397873fb 100644 --- a/include/parasite.h +++ b/include/parasite.h @@ -84,6 +84,7 @@ struct parasite_dump_misc { u32 sid; u32 pgid; u32 tls; + u32 umask; }; #define PARASITE_MAX_GROUPS (PAGE_SIZE / sizeof(unsigned int)) diff --git a/pie/parasite.c b/pie/parasite.c index 46c7224de..036bc6389 100644 --- a/pie/parasite.c +++ b/pie/parasite.c @@ -290,6 +290,8 @@ static int dump_misc(struct parasite_dump_misc *args) args->sid = sys_getsid(); args->pgid = sys_getpgid(0); args->tls = arch_get_tls(); + args->umask = sys_umask(0); + sys_umask(args->umask); /* never fails */ return 0; } diff --git a/protobuf/fs.proto b/protobuf/fs.proto index e893de375..d962a77fd 100644 --- a/protobuf/fs.proto +++ b/protobuf/fs.proto @@ -1,4 +1,5 @@ message fs_entry { required uint32 cwd_id = 1; required uint32 root_id = 2; + optional uint32 umask = 3; } diff --git a/test/zdtm.sh b/test/zdtm.sh index 2ed2c87f0..d98e45eaf 100644 --- a/test/zdtm.sh +++ b/test/zdtm.sh @@ -30,6 +30,7 @@ static/xids00 static/groups static/pthread00 static/pthread01 +static/umask00 streaming/pipe_loop00 streaming/pipe_shared00 transition/file_read