Commit f3cd454c authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

sk-unix: dump/restore a file permissions

Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent a27f0e5c
import "fown.proto"; import "fown.proto";
import "sk-opts.proto"; import "sk-opts.proto";
message file_perms_entry {
required uint32 mode = 1;
required uint32 uid = 2;
required uint32 gid = 3;
}
message unix_sk_entry { message unix_sk_entry {
/* /*
* Few words about why we need both -- id and ino. * Few words about why we need both -- id and ino.
...@@ -31,4 +37,6 @@ message unix_sk_entry { ...@@ -31,4 +37,6 @@ message unix_sk_entry {
required bytes name = 11; required bytes name = 11;
optional sk_shutdown shutdown = 12; optional sk_shutdown shutdown = 12;
optional file_perms_entry file_perms = 13;
} }
...@@ -37,6 +37,11 @@ struct unix_sk_desc { ...@@ -37,6 +37,11 @@ struct unix_sk_desc {
unsigned int nr_icons; unsigned int nr_icons;
unsigned int *icons; unsigned int *icons;
unsigned char shutdown; unsigned char shutdown;
mode_t mode;
uid_t uid;
gid_t gid;
struct list_head list; struct list_head list;
}; };
...@@ -108,6 +113,7 @@ static int dump_one_unix_fd(int lfd, u32 id, const struct fd_parms *p) ...@@ -108,6 +113,7 @@ static int dump_one_unix_fd(int lfd, u32 id, const struct fd_parms *p)
struct unix_sk_desc *sk; struct unix_sk_desc *sk;
UnixSkEntry ue = UNIX_SK_ENTRY__INIT; UnixSkEntry ue = UNIX_SK_ENTRY__INIT;
SkOptsEntry skopts = SK_OPTS_ENTRY__INIT; SkOptsEntry skopts = SK_OPTS_ENTRY__INIT;
FilePermsEntry perms = FILE_PERMS_ENTRY__INIT;
sk = (struct unix_sk_desc *)lookup_socket(p->stat.st_ino, PF_UNIX); sk = (struct unix_sk_desc *)lookup_socket(p->stat.st_ino, PF_UNIX);
if (!sk) if (!sk)
...@@ -132,6 +138,14 @@ static int dump_one_unix_fd(int lfd, u32 id, const struct fd_parms *p) ...@@ -132,6 +138,14 @@ static int dump_one_unix_fd(int lfd, u32 id, const struct fd_parms *p)
ue.opts = &skopts; ue.opts = &skopts;
ue.uflags = 0; ue.uflags = 0;
if (sk->namelen && *sk->name) {
ue.file_perms = &perms;
perms.mode = sk->mode;
perms.uid = sk->uid;
perms.gid = sk->gid;
}
sk_encode_shutdown(&ue, sk->shutdown); sk_encode_shutdown(&ue, sk->shutdown);
if (ue.peer) { if (ue.peer) {
...@@ -323,6 +337,10 @@ static int unix_collect_one(const struct unix_diag_msg *m, ...@@ -323,6 +337,10 @@ static int unix_collect_one(const struct unix_diag_msg *m,
len = 0; len = 0;
name = NULL; name = NULL;
} }
d->mode = st.st_mode;
d->uid = st.st_uid;
d->gid = st.st_gid;
} }
d->namelen = len; d->namelen = len;
...@@ -564,6 +582,29 @@ static int bind_unix_sk(int sk, struct unix_sk_info *ui) ...@@ -564,6 +582,29 @@ static int bind_unix_sk(int sk, struct unix_sk_info *ui)
return -1; return -1;
} }
if (ui->ue->name.len && *ui->name && ui->ue->file_perms) {
FilePermsEntry *perms = ui->ue->file_perms;
char fname[PATH_MAX];
if (ui->ue->name.len >= sizeof(fname)) {
pr_err("The file name is too long\n");
return -1;
}
memcpy(fname, ui->name, ui->ue->name.len);
fname[ui->ue->name.len] = '\0';
if (chown(fname, perms->uid, perms->gid) == -1) {
pr_perror("Unable to change file owner and group");
return -1;
}
if (chmod(fname, perms->mode) == -1) {
pr_perror("Unable to change file mode bits");
return -1;
}
}
futex_set_and_wake(&ui->bound, 1); futex_set_and_wake(&ui->bound, 1);
done: done:
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment