diff options
author | Steven Rostedt (Red Hat) <rostedt@goodmis.org> | 2013-12-06 11:29:39 -0500 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2013-12-06 11:29:39 -0500 |
commit | bbf76a78b4a43f66a6c212fe1306bfb56466a0de (patch) | |
tree | fc6034bc2a94794eac52b9086af4f5df72399842 /lib | |
parent | 79f848ea36f33a20a2e2dcfe314689d012450c3c (diff) | |
parent | 538069756ce13f9d0e0ccb7a17b6935a0bfb7cad (diff) |
Merge tag 'v3.10.22' into v3.10-rt
This is the 3.10.22 stable release
Diffstat (limited to 'lib')
-rw-r--r-- | lib/vsprintf.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index e149c6416384..620fae4c11f6 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -26,6 +26,7 @@ #include <linux/math64.h> #include <linux/uaccess.h> #include <linux/ioport.h> +#include <linux/cred.h> #include <net/addrconf.h> #include <asm/page.h> /* for PAGE_SIZE */ @@ -1118,11 +1119,37 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr, spec.field_width = default_width; return string(buf, end, "pK-error", spec); } - if (!((kptr_restrict == 0) || - (kptr_restrict == 1 && - has_capability_noaudit(current, CAP_SYSLOG)))) + + switch (kptr_restrict) { + case 0: + /* Always print %pK values */ + break; + case 1: { + /* + * Only print the real pointer value if the current + * process has CAP_SYSLOG and is running with the + * same credentials it started with. This is because + * access to files is checked at open() time, but %pK + * checks permission at read() time. We don't want to + * leak pointer values if a binary opens a file using + * %pK and then elevates privileges before reading it. + */ + const struct cred *cred = current_cred(); + + if (!has_capability_noaudit(current, CAP_SYSLOG) || + !uid_eq(cred->euid, cred->uid) || + !gid_eq(cred->egid, cred->gid)) + ptr = NULL; + break; + } + case 2: + default: + /* Always print 0's for %pK */ ptr = NULL; + break; + } break; + case 'N': switch (fmt[1]) { case 'F': |