diff options
Diffstat (limited to 'fs/proc/base.c')
| -rw-r--r-- | fs/proc/base.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index 243a94af0427..fe8d55fb17cc 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
| @@ -551,6 +551,27 @@ static int proc_fd_access_allowed(struct inode *inode) | |||
| 551 | return allowed; | 551 | return allowed; |
| 552 | } | 552 | } |
| 553 | 553 | ||
| 554 | static int proc_setattr(struct dentry *dentry, struct iattr *attr) | ||
| 555 | { | ||
| 556 | int error; | ||
| 557 | struct inode *inode = dentry->d_inode; | ||
| 558 | |||
| 559 | if (attr->ia_valid & ATTR_MODE) | ||
| 560 | return -EPERM; | ||
| 561 | |||
| 562 | error = inode_change_ok(inode, attr); | ||
| 563 | if (!error) { | ||
| 564 | error = security_inode_setattr(dentry, attr); | ||
| 565 | if (!error) | ||
| 566 | error = inode_setattr(inode, attr); | ||
| 567 | } | ||
| 568 | return error; | ||
| 569 | } | ||
| 570 | |||
| 571 | static struct inode_operations proc_def_inode_operations = { | ||
| 572 | .setattr = proc_setattr, | ||
| 573 | }; | ||
| 574 | |||
| 554 | extern struct seq_operations mounts_op; | 575 | extern struct seq_operations mounts_op; |
| 555 | struct proc_mounts { | 576 | struct proc_mounts { |
| 556 | struct seq_file m; | 577 | struct seq_file m; |
| @@ -1111,7 +1132,8 @@ out: | |||
| 1111 | 1132 | ||
| 1112 | static struct inode_operations proc_pid_link_inode_operations = { | 1133 | static struct inode_operations proc_pid_link_inode_operations = { |
| 1113 | .readlink = proc_pid_readlink, | 1134 | .readlink = proc_pid_readlink, |
| 1114 | .follow_link = proc_pid_follow_link | 1135 | .follow_link = proc_pid_follow_link, |
| 1136 | .setattr = proc_setattr, | ||
| 1115 | }; | 1137 | }; |
| 1116 | 1138 | ||
| 1117 | static int proc_readfd(struct file * filp, void * dirent, filldir_t filldir) | 1139 | static int proc_readfd(struct file * filp, void * dirent, filldir_t filldir) |
| @@ -1285,6 +1307,7 @@ static struct inode *proc_pid_make_inode(struct super_block * sb, struct task_st | |||
| 1285 | ei = PROC_I(inode); | 1307 | ei = PROC_I(inode); |
| 1286 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; | 1308 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; |
| 1287 | inode->i_ino = fake_ino(task->pid, ino); | 1309 | inode->i_ino = fake_ino(task->pid, ino); |
| 1310 | inode->i_op = &proc_def_inode_operations; | ||
| 1288 | 1311 | ||
| 1289 | /* | 1312 | /* |
| 1290 | * grab the reference to task. | 1313 | * grab the reference to task. |
| @@ -1339,6 +1362,7 @@ static int pid_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
| 1339 | inode->i_uid = 0; | 1362 | inode->i_uid = 0; |
| 1340 | inode->i_gid = 0; | 1363 | inode->i_gid = 0; |
| 1341 | } | 1364 | } |
| 1365 | inode->i_mode &= ~(S_ISUID | S_ISGID); | ||
| 1342 | security_task_to_inode(task, inode); | 1366 | security_task_to_inode(task, inode); |
| 1343 | put_task_struct(task); | 1367 | put_task_struct(task); |
| 1344 | return 1; | 1368 | return 1; |
| @@ -1389,6 +1413,7 @@ static int tid_fd_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
| 1389 | inode->i_uid = 0; | 1413 | inode->i_uid = 0; |
| 1390 | inode->i_gid = 0; | 1414 | inode->i_gid = 0; |
| 1391 | } | 1415 | } |
| 1416 | inode->i_mode &= ~(S_ISUID | S_ISGID); | ||
| 1392 | security_task_to_inode(task, inode); | 1417 | security_task_to_inode(task, inode); |
| 1393 | put_task_struct(task); | 1418 | put_task_struct(task); |
| 1394 | return 1; | 1419 | return 1; |
| @@ -1527,11 +1552,13 @@ static struct file_operations proc_task_operations = { | |||
| 1527 | */ | 1552 | */ |
| 1528 | static struct inode_operations proc_fd_inode_operations = { | 1553 | static struct inode_operations proc_fd_inode_operations = { |
| 1529 | .lookup = proc_lookupfd, | 1554 | .lookup = proc_lookupfd, |
| 1555 | .setattr = proc_setattr, | ||
| 1530 | }; | 1556 | }; |
| 1531 | 1557 | ||
| 1532 | static struct inode_operations proc_task_inode_operations = { | 1558 | static struct inode_operations proc_task_inode_operations = { |
| 1533 | .lookup = proc_task_lookup, | 1559 | .lookup = proc_task_lookup, |
| 1534 | .getattr = proc_task_getattr, | 1560 | .getattr = proc_task_getattr, |
| 1561 | .setattr = proc_setattr, | ||
| 1535 | }; | 1562 | }; |
| 1536 | 1563 | ||
| 1537 | #ifdef CONFIG_SECURITY | 1564 | #ifdef CONFIG_SECURITY |
| @@ -1845,11 +1872,13 @@ static struct file_operations proc_tid_base_operations = { | |||
| 1845 | static struct inode_operations proc_tgid_base_inode_operations = { | 1872 | static struct inode_operations proc_tgid_base_inode_operations = { |
| 1846 | .lookup = proc_tgid_base_lookup, | 1873 | .lookup = proc_tgid_base_lookup, |
| 1847 | .getattr = pid_getattr, | 1874 | .getattr = pid_getattr, |
| 1875 | .setattr = proc_setattr, | ||
| 1848 | }; | 1876 | }; |
| 1849 | 1877 | ||
| 1850 | static struct inode_operations proc_tid_base_inode_operations = { | 1878 | static struct inode_operations proc_tid_base_inode_operations = { |
| 1851 | .lookup = proc_tid_base_lookup, | 1879 | .lookup = proc_tid_base_lookup, |
| 1852 | .getattr = pid_getattr, | 1880 | .getattr = pid_getattr, |
| 1881 | .setattr = proc_setattr, | ||
| 1853 | }; | 1882 | }; |
| 1854 | 1883 | ||
| 1855 | #ifdef CONFIG_SECURITY | 1884 | #ifdef CONFIG_SECURITY |
| @@ -1892,11 +1921,13 @@ static struct dentry *proc_tid_attr_lookup(struct inode *dir, | |||
| 1892 | static struct inode_operations proc_tgid_attr_inode_operations = { | 1921 | static struct inode_operations proc_tgid_attr_inode_operations = { |
| 1893 | .lookup = proc_tgid_attr_lookup, | 1922 | .lookup = proc_tgid_attr_lookup, |
| 1894 | .getattr = pid_getattr, | 1923 | .getattr = pid_getattr, |
| 1924 | .setattr = proc_setattr, | ||
| 1895 | }; | 1925 | }; |
| 1896 | 1926 | ||
| 1897 | static struct inode_operations proc_tid_attr_inode_operations = { | 1927 | static struct inode_operations proc_tid_attr_inode_operations = { |
| 1898 | .lookup = proc_tid_attr_lookup, | 1928 | .lookup = proc_tid_attr_lookup, |
| 1899 | .getattr = pid_getattr, | 1929 | .getattr = pid_getattr, |
| 1930 | .setattr = proc_setattr, | ||
| 1900 | }; | 1931 | }; |
| 1901 | #endif | 1932 | #endif |
| 1902 | 1933 | ||
