diff options
| author | Andreas Gruenbacher <agruenba@redhat.com> | 2016-11-10 16:18:28 -0500 |
|---|---|---|
| committer | Paul Moore <paul@paul-moore.com> | 2016-11-14 15:39:48 -0500 |
| commit | db978da8fa1d0819b210c137d31a339149b88875 (patch) | |
| tree | 877976508c0ebadc5372fecdb82f0e91121c1c1a /fs/proc | |
| parent | 420591128cb206201dc444c2d42fb6f299b2ecd0 (diff) | |
proc: Pass file mode to proc_pid_make_inode
Pass the file mode of the proc inode to be created to
proc_pid_make_inode. In proc_pid_make_inode, initialize inode->i_mode
before calling security_task_to_inode. This allows selinux to set
isec->sclass right away without introducing "half-initialized" inode
security structs.
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Paul Moore <paul@paul-moore.com>
Diffstat (limited to 'fs/proc')
| -rw-r--r-- | fs/proc/base.c | 23 | ||||
| -rw-r--r-- | fs/proc/fd.c | 6 | ||||
| -rw-r--r-- | fs/proc/internal.h | 2 | ||||
| -rw-r--r-- | fs/proc/namespaces.c | 3 |
4 files changed, 13 insertions, 21 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index 8e654468ab67..9de05e5854ef 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
| @@ -1663,7 +1663,8 @@ const struct inode_operations proc_pid_link_inode_operations = { | |||
| 1663 | 1663 | ||
| 1664 | /* building an inode */ | 1664 | /* building an inode */ |
| 1665 | 1665 | ||
| 1666 | struct inode *proc_pid_make_inode(struct super_block * sb, struct task_struct *task) | 1666 | struct inode *proc_pid_make_inode(struct super_block * sb, |
| 1667 | struct task_struct *task, umode_t mode) | ||
| 1667 | { | 1668 | { |
| 1668 | struct inode * inode; | 1669 | struct inode * inode; |
| 1669 | struct proc_inode *ei; | 1670 | struct proc_inode *ei; |
| @@ -1677,6 +1678,7 @@ struct inode *proc_pid_make_inode(struct super_block * sb, struct task_struct *t | |||
| 1677 | 1678 | ||
| 1678 | /* Common stuff */ | 1679 | /* Common stuff */ |
| 1679 | ei = PROC_I(inode); | 1680 | ei = PROC_I(inode); |
| 1681 | inode->i_mode = mode; | ||
| 1680 | inode->i_ino = get_next_ino(); | 1682 | inode->i_ino = get_next_ino(); |
| 1681 | inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode); | 1683 | inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode); |
| 1682 | inode->i_op = &proc_def_inode_operations; | 1684 | inode->i_op = &proc_def_inode_operations; |
| @@ -2003,7 +2005,9 @@ proc_map_files_instantiate(struct inode *dir, struct dentry *dentry, | |||
| 2003 | struct proc_inode *ei; | 2005 | struct proc_inode *ei; |
| 2004 | struct inode *inode; | 2006 | struct inode *inode; |
| 2005 | 2007 | ||
| 2006 | inode = proc_pid_make_inode(dir->i_sb, task); | 2008 | inode = proc_pid_make_inode(dir->i_sb, task, S_IFLNK | |
| 2009 | ((mode & FMODE_READ ) ? S_IRUSR : 0) | | ||
| 2010 | ((mode & FMODE_WRITE) ? S_IWUSR : 0)); | ||
| 2007 | if (!inode) | 2011 | if (!inode) |
| 2008 | return -ENOENT; | 2012 | return -ENOENT; |
| 2009 | 2013 | ||
| @@ -2012,12 +2016,6 @@ proc_map_files_instantiate(struct inode *dir, struct dentry *dentry, | |||
| 2012 | 2016 | ||
| 2013 | inode->i_op = &proc_map_files_link_inode_operations; | 2017 | inode->i_op = &proc_map_files_link_inode_operations; |
| 2014 | inode->i_size = 64; | 2018 | inode->i_size = 64; |
| 2015 | inode->i_mode = S_IFLNK; | ||
| 2016 | |||
| 2017 | if (mode & FMODE_READ) | ||
| 2018 | inode->i_mode |= S_IRUSR; | ||
| 2019 | if (mode & FMODE_WRITE) | ||
| 2020 | inode->i_mode |= S_IWUSR; | ||
| 2021 | 2019 | ||
| 2022 | d_set_d_op(dentry, &tid_map_files_dentry_operations); | 2020 | d_set_d_op(dentry, &tid_map_files_dentry_operations); |
| 2023 | d_add(dentry, inode); | 2021 | d_add(dentry, inode); |
| @@ -2371,12 +2369,11 @@ static int proc_pident_instantiate(struct inode *dir, | |||
| 2371 | struct inode *inode; | 2369 | struct inode *inode; |
| 2372 | struct proc_inode *ei; | 2370 | struct proc_inode *ei; |
| 2373 | 2371 | ||
| 2374 | inode = proc_pid_make_inode(dir->i_sb, task); | 2372 | inode = proc_pid_make_inode(dir->i_sb, task, p->mode); |
| 2375 | if (!inode) | 2373 | if (!inode) |
| 2376 | goto out; | 2374 | goto out; |
| 2377 | 2375 | ||
| 2378 | ei = PROC_I(inode); | 2376 | ei = PROC_I(inode); |
| 2379 | inode->i_mode = p->mode; | ||
| 2380 | if (S_ISDIR(inode->i_mode)) | 2377 | if (S_ISDIR(inode->i_mode)) |
| 2381 | set_nlink(inode, 2); /* Use getattr to fix if necessary */ | 2378 | set_nlink(inode, 2); /* Use getattr to fix if necessary */ |
| 2382 | if (p->iop) | 2379 | if (p->iop) |
| @@ -3058,11 +3055,10 @@ static int proc_pid_instantiate(struct inode *dir, | |||
| 3058 | { | 3055 | { |
| 3059 | struct inode *inode; | 3056 | struct inode *inode; |
| 3060 | 3057 | ||
| 3061 | inode = proc_pid_make_inode(dir->i_sb, task); | 3058 | inode = proc_pid_make_inode(dir->i_sb, task, S_IFDIR | S_IRUGO | S_IXUGO); |
| 3062 | if (!inode) | 3059 | if (!inode) |
| 3063 | goto out; | 3060 | goto out; |
| 3064 | 3061 | ||
| 3065 | inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO; | ||
| 3066 | inode->i_op = &proc_tgid_base_inode_operations; | 3062 | inode->i_op = &proc_tgid_base_inode_operations; |
| 3067 | inode->i_fop = &proc_tgid_base_operations; | 3063 | inode->i_fop = &proc_tgid_base_operations; |
| 3068 | inode->i_flags|=S_IMMUTABLE; | 3064 | inode->i_flags|=S_IMMUTABLE; |
| @@ -3351,11 +3347,10 @@ static int proc_task_instantiate(struct inode *dir, | |||
| 3351 | struct dentry *dentry, struct task_struct *task, const void *ptr) | 3347 | struct dentry *dentry, struct task_struct *task, const void *ptr) |
| 3352 | { | 3348 | { |
| 3353 | struct inode *inode; | 3349 | struct inode *inode; |
| 3354 | inode = proc_pid_make_inode(dir->i_sb, task); | 3350 | inode = proc_pid_make_inode(dir->i_sb, task, S_IFDIR | S_IRUGO | S_IXUGO); |
| 3355 | 3351 | ||
| 3356 | if (!inode) | 3352 | if (!inode) |
| 3357 | goto out; | 3353 | goto out; |
| 3358 | inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO; | ||
| 3359 | inode->i_op = &proc_tid_base_inode_operations; | 3354 | inode->i_op = &proc_tid_base_inode_operations; |
| 3360 | inode->i_fop = &proc_tid_base_operations; | 3355 | inode->i_fop = &proc_tid_base_operations; |
| 3361 | inode->i_flags|=S_IMMUTABLE; | 3356 | inode->i_flags|=S_IMMUTABLE; |
diff --git a/fs/proc/fd.c b/fs/proc/fd.c index d21dafef3102..4274f83bf100 100644 --- a/fs/proc/fd.c +++ b/fs/proc/fd.c | |||
| @@ -183,14 +183,13 @@ proc_fd_instantiate(struct inode *dir, struct dentry *dentry, | |||
| 183 | struct proc_inode *ei; | 183 | struct proc_inode *ei; |
| 184 | struct inode *inode; | 184 | struct inode *inode; |
| 185 | 185 | ||
| 186 | inode = proc_pid_make_inode(dir->i_sb, task); | 186 | inode = proc_pid_make_inode(dir->i_sb, task, S_IFLNK); |
| 187 | if (!inode) | 187 | if (!inode) |
| 188 | goto out; | 188 | goto out; |
| 189 | 189 | ||
| 190 | ei = PROC_I(inode); | 190 | ei = PROC_I(inode); |
| 191 | ei->fd = fd; | 191 | ei->fd = fd; |
| 192 | 192 | ||
| 193 | inode->i_mode = S_IFLNK; | ||
| 194 | inode->i_op = &proc_pid_link_inode_operations; | 193 | inode->i_op = &proc_pid_link_inode_operations; |
| 195 | inode->i_size = 64; | 194 | inode->i_size = 64; |
| 196 | 195 | ||
| @@ -322,14 +321,13 @@ proc_fdinfo_instantiate(struct inode *dir, struct dentry *dentry, | |||
| 322 | struct proc_inode *ei; | 321 | struct proc_inode *ei; |
| 323 | struct inode *inode; | 322 | struct inode *inode; |
| 324 | 323 | ||
| 325 | inode = proc_pid_make_inode(dir->i_sb, task); | 324 | inode = proc_pid_make_inode(dir->i_sb, task, S_IFREG | S_IRUSR); |
| 326 | if (!inode) | 325 | if (!inode) |
| 327 | goto out; | 326 | goto out; |
| 328 | 327 | ||
| 329 | ei = PROC_I(inode); | 328 | ei = PROC_I(inode); |
| 330 | ei->fd = fd; | 329 | ei->fd = fd; |
| 331 | 330 | ||
| 332 | inode->i_mode = S_IFREG | S_IRUSR; | ||
| 333 | inode->i_fop = &proc_fdinfo_file_operations; | 331 | inode->i_fop = &proc_fdinfo_file_operations; |
| 334 | 332 | ||
| 335 | d_set_d_op(dentry, &tid_fd_dentry_operations); | 333 | d_set_d_op(dentry, &tid_fd_dentry_operations); |
diff --git a/fs/proc/internal.h b/fs/proc/internal.h index 5378441ec1b7..f4494dcbdc8b 100644 --- a/fs/proc/internal.h +++ b/fs/proc/internal.h | |||
| @@ -162,7 +162,7 @@ extern int proc_pid_statm(struct seq_file *, struct pid_namespace *, | |||
| 162 | extern const struct dentry_operations pid_dentry_operations; | 162 | extern const struct dentry_operations pid_dentry_operations; |
| 163 | extern int pid_getattr(struct vfsmount *, struct dentry *, struct kstat *); | 163 | extern int pid_getattr(struct vfsmount *, struct dentry *, struct kstat *); |
| 164 | extern int proc_setattr(struct dentry *, struct iattr *); | 164 | extern int proc_setattr(struct dentry *, struct iattr *); |
| 165 | extern struct inode *proc_pid_make_inode(struct super_block *, struct task_struct *); | 165 | extern struct inode *proc_pid_make_inode(struct super_block *, struct task_struct *, umode_t); |
| 166 | extern int pid_revalidate(struct dentry *, unsigned int); | 166 | extern int pid_revalidate(struct dentry *, unsigned int); |
| 167 | extern int pid_delete_dentry(const struct dentry *); | 167 | extern int pid_delete_dentry(const struct dentry *); |
| 168 | extern int proc_pid_readdir(struct file *, struct dir_context *); | 168 | extern int proc_pid_readdir(struct file *, struct dir_context *); |
diff --git a/fs/proc/namespaces.c b/fs/proc/namespaces.c index 51b8b0a8ad91..766f0c637ad1 100644 --- a/fs/proc/namespaces.c +++ b/fs/proc/namespaces.c | |||
| @@ -92,12 +92,11 @@ static int proc_ns_instantiate(struct inode *dir, | |||
| 92 | struct inode *inode; | 92 | struct inode *inode; |
| 93 | struct proc_inode *ei; | 93 | struct proc_inode *ei; |
| 94 | 94 | ||
| 95 | inode = proc_pid_make_inode(dir->i_sb, task); | 95 | inode = proc_pid_make_inode(dir->i_sb, task, S_IFLNK | S_IRWXUGO); |
| 96 | if (!inode) | 96 | if (!inode) |
| 97 | goto out; | 97 | goto out; |
| 98 | 98 | ||
| 99 | ei = PROC_I(inode); | 99 | ei = PROC_I(inode); |
| 100 | inode->i_mode = S_IFLNK|S_IRWXUGO; | ||
| 101 | inode->i_op = &proc_ns_link_inode_operations; | 100 | inode->i_op = &proc_ns_link_inode_operations; |
| 102 | ei->ns_ops = ns_ops; | 101 | ei->ns_ops = ns_ops; |
| 103 | 102 | ||
