diff options
Diffstat (limited to 'fs/proc/base.c')
| -rw-r--r-- | fs/proc/base.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index d4677603c889..0a8a5f880349 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
| @@ -1406,6 +1406,7 @@ static struct inode *proc_pid_make_inode(struct super_block * sb, struct task_st | |||
| 1406 | { | 1406 | { |
| 1407 | struct inode * inode; | 1407 | struct inode * inode; |
| 1408 | struct proc_inode *ei; | 1408 | struct proc_inode *ei; |
| 1409 | const struct cred *cred; | ||
| 1409 | 1410 | ||
| 1410 | /* We need a new inode */ | 1411 | /* We need a new inode */ |
| 1411 | 1412 | ||
| @@ -1428,8 +1429,11 @@ static struct inode *proc_pid_make_inode(struct super_block * sb, struct task_st | |||
| 1428 | inode->i_uid = 0; | 1429 | inode->i_uid = 0; |
| 1429 | inode->i_gid = 0; | 1430 | inode->i_gid = 0; |
| 1430 | if (task_dumpable(task)) { | 1431 | if (task_dumpable(task)) { |
| 1431 | inode->i_uid = task->euid; | 1432 | rcu_read_lock(); |
| 1432 | inode->i_gid = task->egid; | 1433 | cred = __task_cred(task); |
| 1434 | inode->i_uid = cred->euid; | ||
| 1435 | inode->i_gid = cred->egid; | ||
| 1436 | rcu_read_unlock(); | ||
| 1433 | } | 1437 | } |
| 1434 | security_task_to_inode(task, inode); | 1438 | security_task_to_inode(task, inode); |
| 1435 | 1439 | ||
| @@ -1445,6 +1449,8 @@ static int pid_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat | |||
| 1445 | { | 1449 | { |
| 1446 | struct inode *inode = dentry->d_inode; | 1450 | struct inode *inode = dentry->d_inode; |
| 1447 | struct task_struct *task; | 1451 | struct task_struct *task; |
| 1452 | const struct cred *cred; | ||
| 1453 | |||
| 1448 | generic_fillattr(inode, stat); | 1454 | generic_fillattr(inode, stat); |
| 1449 | 1455 | ||
| 1450 | rcu_read_lock(); | 1456 | rcu_read_lock(); |
| @@ -1454,8 +1460,9 @@ static int pid_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat | |||
| 1454 | if (task) { | 1460 | if (task) { |
| 1455 | if ((inode->i_mode == (S_IFDIR|S_IRUGO|S_IXUGO)) || | 1461 | if ((inode->i_mode == (S_IFDIR|S_IRUGO|S_IXUGO)) || |
| 1456 | task_dumpable(task)) { | 1462 | task_dumpable(task)) { |
| 1457 | stat->uid = task->euid; | 1463 | cred = __task_cred(task); |
| 1458 | stat->gid = task->egid; | 1464 | stat->uid = cred->euid; |
| 1465 | stat->gid = cred->egid; | ||
| 1459 | } | 1466 | } |
| 1460 | } | 1467 | } |
| 1461 | rcu_read_unlock(); | 1468 | rcu_read_unlock(); |
| @@ -1483,11 +1490,16 @@ static int pid_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
| 1483 | { | 1490 | { |
| 1484 | struct inode *inode = dentry->d_inode; | 1491 | struct inode *inode = dentry->d_inode; |
| 1485 | struct task_struct *task = get_proc_task(inode); | 1492 | struct task_struct *task = get_proc_task(inode); |
| 1493 | const struct cred *cred; | ||
| 1494 | |||
| 1486 | if (task) { | 1495 | if (task) { |
| 1487 | if ((inode->i_mode == (S_IFDIR|S_IRUGO|S_IXUGO)) || | 1496 | if ((inode->i_mode == (S_IFDIR|S_IRUGO|S_IXUGO)) || |
| 1488 | task_dumpable(task)) { | 1497 | task_dumpable(task)) { |
| 1489 | inode->i_uid = task->euid; | 1498 | rcu_read_lock(); |
| 1490 | inode->i_gid = task->egid; | 1499 | cred = __task_cred(task); |
| 1500 | inode->i_uid = cred->euid; | ||
| 1501 | inode->i_gid = cred->egid; | ||
| 1502 | rcu_read_unlock(); | ||
| 1491 | } else { | 1503 | } else { |
| 1492 | inode->i_uid = 0; | 1504 | inode->i_uid = 0; |
| 1493 | inode->i_gid = 0; | 1505 | inode->i_gid = 0; |
| @@ -1649,6 +1661,7 @@ static int tid_fd_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
| 1649 | struct task_struct *task = get_proc_task(inode); | 1661 | struct task_struct *task = get_proc_task(inode); |
| 1650 | int fd = proc_fd(inode); | 1662 | int fd = proc_fd(inode); |
| 1651 | struct files_struct *files; | 1663 | struct files_struct *files; |
| 1664 | const struct cred *cred; | ||
| 1652 | 1665 | ||
| 1653 | if (task) { | 1666 | if (task) { |
| 1654 | files = get_files_struct(task); | 1667 | files = get_files_struct(task); |
| @@ -1658,8 +1671,11 @@ static int tid_fd_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
| 1658 | rcu_read_unlock(); | 1671 | rcu_read_unlock(); |
| 1659 | put_files_struct(files); | 1672 | put_files_struct(files); |
| 1660 | if (task_dumpable(task)) { | 1673 | if (task_dumpable(task)) { |
| 1661 | inode->i_uid = task->euid; | 1674 | rcu_read_lock(); |
| 1662 | inode->i_gid = task->egid; | 1675 | cred = __task_cred(task); |
| 1676 | inode->i_uid = cred->euid; | ||
| 1677 | inode->i_gid = cred->egid; | ||
| 1678 | rcu_read_unlock(); | ||
| 1663 | } else { | 1679 | } else { |
| 1664 | inode->i_uid = 0; | 1680 | inode->i_uid = 0; |
| 1665 | inode->i_gid = 0; | 1681 | inode->i_gid = 0; |
