Commit adb37c4c authored by Eric W. Biederman's avatar Eric W. Biederman

userns: Make seq_file's user namespace accessible

struct file already has a user namespace associated with it
in file->f_cred->user_ns, unfortunately because struct
seq_file has no struct file backpointer associated with
it, it is difficult to get at the user namespace in seq_file
context.  Therefore add a helper function seq_user_ns to return
the associated user namespace and a user_ns field to struct
seq_file to be used in implementing seq_user_ns.

Cc: Al Viro <viro@ZenIV.linux.org.uk>
Cc: Eric Dumazet <eric.dumazet@gmail.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Acked-by: default avatarDavid S. Miller <davem@davemloft.net>
Acked-by: default avatarSerge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
parent fc5795c8
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/export.h> #include <linux/export.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/cred.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/page.h> #include <asm/page.h>
...@@ -56,6 +57,9 @@ int seq_open(struct file *file, const struct seq_operations *op) ...@@ -56,6 +57,9 @@ int seq_open(struct file *file, const struct seq_operations *op)
memset(p, 0, sizeof(*p)); memset(p, 0, sizeof(*p));
mutex_init(&p->lock); mutex_init(&p->lock);
p->op = op; p->op = op;
#ifdef CONFIG_USER_NS
p->user_ns = file->f_cred->user_ns;
#endif
/* /*
* Wrappers around seq_open(e.g. swaps_open) need to be * Wrappers around seq_open(e.g. swaps_open) need to be
......
...@@ -13,6 +13,7 @@ struct file; ...@@ -13,6 +13,7 @@ struct file;
struct path; struct path;
struct inode; struct inode;
struct dentry; struct dentry;
struct user_namespace;
struct seq_file { struct seq_file {
char *buf; char *buf;
...@@ -25,6 +26,9 @@ struct seq_file { ...@@ -25,6 +26,9 @@ struct seq_file {
struct mutex lock; struct mutex lock;
const struct seq_operations *op; const struct seq_operations *op;
int poll_event; int poll_event;
#ifdef CONFIG_USER_NS
struct user_namespace *user_ns;
#endif
void *private; void *private;
}; };
...@@ -128,6 +132,16 @@ int seq_put_decimal_ull(struct seq_file *m, char delimiter, ...@@ -128,6 +132,16 @@ int seq_put_decimal_ull(struct seq_file *m, char delimiter,
int seq_put_decimal_ll(struct seq_file *m, char delimiter, int seq_put_decimal_ll(struct seq_file *m, char delimiter,
long long num); long long num);
static inline struct user_namespace *seq_user_ns(struct seq_file *seq)
{
#ifdef CONFIG_USER_NS
return seq->user_ns;
#else
extern struct user_namespace init_user_ns;
return &init_user_ns;
#endif
}
#define SEQ_START_TOKEN ((void *)1) #define SEQ_START_TOKEN ((void *)1)
/* /*
* Helpers for iteration over list_head-s in seq_files * Helpers for iteration over list_head-s in seq_files
......
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