diff options
Diffstat (limited to 'fs/proc')
-rw-r--r-- | fs/proc/array.c | 2 | ||||
-rw-r--r-- | fs/proc/base.c | 31 | ||||
-rw-r--r-- | fs/proc/proc_devtree.c | 7 |
3 files changed, 31 insertions, 9 deletions
diff --git a/fs/proc/array.c b/fs/proc/array.c index 13b5d0708175..18e20feee251 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
@@ -270,7 +270,9 @@ static inline void task_sig(struct seq_file *m, struct task_struct *p) | |||
270 | blocked = p->blocked; | 270 | blocked = p->blocked; |
271 | collect_sigign_sigcatch(p, &ignored, &caught); | 271 | collect_sigign_sigcatch(p, &ignored, &caught); |
272 | num_threads = atomic_read(&p->signal->count); | 272 | num_threads = atomic_read(&p->signal->count); |
273 | rcu_read_lock(); /* FIXME: is this correct? */ | ||
273 | qsize = atomic_read(&__task_cred(p)->user->sigpending); | 274 | qsize = atomic_read(&__task_cred(p)->user->sigpending); |
275 | rcu_read_unlock(); | ||
274 | qlim = p->signal->rlim[RLIMIT_SIGPENDING].rlim_cur; | 276 | qlim = p->signal->rlim[RLIMIT_SIGPENDING].rlim_cur; |
275 | unlock_task_sighand(p, &flags); | 277 | unlock_task_sighand(p, &flags); |
276 | } | 278 | } |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 18d5cc62d8ed..623e2ffb5d2b 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -1095,8 +1095,12 @@ static ssize_t proc_loginuid_write(struct file * file, const char __user * buf, | |||
1095 | if (!capable(CAP_AUDIT_CONTROL)) | 1095 | if (!capable(CAP_AUDIT_CONTROL)) |
1096 | return -EPERM; | 1096 | return -EPERM; |
1097 | 1097 | ||
1098 | if (current != pid_task(proc_pid(inode), PIDTYPE_PID)) | 1098 | rcu_read_lock(); |
1099 | if (current != pid_task(proc_pid(inode), PIDTYPE_PID)) { | ||
1100 | rcu_read_unlock(); | ||
1099 | return -EPERM; | 1101 | return -EPERM; |
1102 | } | ||
1103 | rcu_read_unlock(); | ||
1100 | 1104 | ||
1101 | if (count >= PAGE_SIZE) | 1105 | if (count >= PAGE_SIZE) |
1102 | count = PAGE_SIZE - 1; | 1106 | count = PAGE_SIZE - 1; |
@@ -1419,7 +1423,6 @@ static void *proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
1419 | goto out; | 1423 | goto out; |
1420 | 1424 | ||
1421 | error = PROC_I(inode)->op.proc_get_link(inode, &nd->path); | 1425 | error = PROC_I(inode)->op.proc_get_link(inode, &nd->path); |
1422 | nd->last_type = LAST_BIND; | ||
1423 | out: | 1426 | out: |
1424 | return ERR_PTR(error); | 1427 | return ERR_PTR(error); |
1425 | } | 1428 | } |
@@ -2370,16 +2373,30 @@ static void *proc_self_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
2370 | { | 2373 | { |
2371 | struct pid_namespace *ns = dentry->d_sb->s_fs_info; | 2374 | struct pid_namespace *ns = dentry->d_sb->s_fs_info; |
2372 | pid_t tgid = task_tgid_nr_ns(current, ns); | 2375 | pid_t tgid = task_tgid_nr_ns(current, ns); |
2373 | char tmp[PROC_NUMBUF]; | 2376 | char *name = ERR_PTR(-ENOENT); |
2374 | if (!tgid) | 2377 | if (tgid) { |
2375 | return ERR_PTR(-ENOENT); | 2378 | name = __getname(); |
2376 | sprintf(tmp, "%d", task_tgid_nr_ns(current, ns)); | 2379 | if (!name) |
2377 | return ERR_PTR(vfs_follow_link(nd,tmp)); | 2380 | name = ERR_PTR(-ENOMEM); |
2381 | else | ||
2382 | sprintf(name, "%d", tgid); | ||
2383 | } | ||
2384 | nd_set_link(nd, name); | ||
2385 | return NULL; | ||
2386 | } | ||
2387 | |||
2388 | static void proc_self_put_link(struct dentry *dentry, struct nameidata *nd, | ||
2389 | void *cookie) | ||
2390 | { | ||
2391 | char *s = nd_get_link(nd); | ||
2392 | if (!IS_ERR(s)) | ||
2393 | __putname(s); | ||
2378 | } | 2394 | } |
2379 | 2395 | ||
2380 | static const struct inode_operations proc_self_inode_operations = { | 2396 | static const struct inode_operations proc_self_inode_operations = { |
2381 | .readlink = proc_self_readlink, | 2397 | .readlink = proc_self_readlink, |
2382 | .follow_link = proc_self_follow_link, | 2398 | .follow_link = proc_self_follow_link, |
2399 | .put_link = proc_self_put_link, | ||
2383 | }; | 2400 | }; |
2384 | 2401 | ||
2385 | /* | 2402 | /* |
diff --git a/fs/proc/proc_devtree.c b/fs/proc/proc_devtree.c index 123257bb356b..f8650dce74fb 100644 --- a/fs/proc/proc_devtree.c +++ b/fs/proc/proc_devtree.c | |||
@@ -10,16 +10,19 @@ | |||
10 | #include <linux/seq_file.h> | 10 | #include <linux/seq_file.h> |
11 | #include <linux/stat.h> | 11 | #include <linux/stat.h> |
12 | #include <linux/string.h> | 12 | #include <linux/string.h> |
13 | #include <linux/of.h> | ||
14 | #include <linux/module.h> | ||
13 | #include <asm/prom.h> | 15 | #include <asm/prom.h> |
14 | #include <asm/uaccess.h> | 16 | #include <asm/uaccess.h> |
15 | #include "internal.h" | 17 | #include "internal.h" |
16 | 18 | ||
17 | #ifndef HAVE_ARCH_DEVTREE_FIXUPS | ||
18 | static inline void set_node_proc_entry(struct device_node *np, | 19 | static inline void set_node_proc_entry(struct device_node *np, |
19 | struct proc_dir_entry *de) | 20 | struct proc_dir_entry *de) |
20 | { | 21 | { |
21 | } | 22 | #ifdef HAVE_ARCH_DEVTREE_FIXUPS |
23 | np->pde = de; | ||
22 | #endif | 24 | #endif |
25 | } | ||
23 | 26 | ||
24 | static struct proc_dir_entry *proc_device_tree; | 27 | static struct proc_dir_entry *proc_device_tree; |
25 | 28 | ||