LCOV - code coverage report
Current view: top level - fs/proc - base.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 13 944 1.4 %
Date: 2023-03-27 20:00:47 Functions: 3 87 3.4 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0
       2             : /*
       3             :  *  linux/fs/proc/base.c
       4             :  *
       5             :  *  Copyright (C) 1991, 1992 Linus Torvalds
       6             :  *
       7             :  *  proc base directory handling functions
       8             :  *
       9             :  *  1999, Al Viro. Rewritten. Now it covers the whole per-process part.
      10             :  *  Instead of using magical inumbers to determine the kind of object
      11             :  *  we allocate and fill in-core inodes upon lookup. They don't even
      12             :  *  go into icache. We cache the reference to task_struct upon lookup too.
      13             :  *  Eventually it should become a filesystem in its own. We don't use the
      14             :  *  rest of procfs anymore.
      15             :  *
      16             :  *
      17             :  *  Changelog:
      18             :  *  17-Jan-2005
      19             :  *  Allan Bezerra
      20             :  *  Bruna Moreira <bruna.moreira@indt.org.br>
      21             :  *  Edjard Mota <edjard.mota@indt.org.br>
      22             :  *  Ilias Biris <ilias.biris@indt.org.br>
      23             :  *  Mauricio Lin <mauricio.lin@indt.org.br>
      24             :  *
      25             :  *  Embedded Linux Lab - 10LE Instituto Nokia de Tecnologia - INdT
      26             :  *
      27             :  *  A new process specific entry (smaps) included in /proc. It shows the
      28             :  *  size of rss for each memory area. The maps entry lacks information
      29             :  *  about physical memory size (rss) for each mapped file, i.e.,
      30             :  *  rss information for executables and library files.
      31             :  *  This additional information is useful for any tools that need to know
      32             :  *  about physical memory consumption for a process specific library.
      33             :  *
      34             :  *  Changelog:
      35             :  *  21-Feb-2005
      36             :  *  Embedded Linux Lab - 10LE Instituto Nokia de Tecnologia - INdT
      37             :  *  Pud inclusion in the page table walking.
      38             :  *
      39             :  *  ChangeLog:
      40             :  *  10-Mar-2005
      41             :  *  10LE Instituto Nokia de Tecnologia - INdT:
      42             :  *  A better way to walks through the page table as suggested by Hugh Dickins.
      43             :  *
      44             :  *  Simo Piiroinen <simo.piiroinen@nokia.com>:
      45             :  *  Smaps information related to shared, private, clean and dirty pages.
      46             :  *
      47             :  *  Paul Mundt <paul.mundt@nokia.com>:
      48             :  *  Overall revision about smaps.
      49             :  */
      50             : 
      51             : #include <linux/uaccess.h>
      52             : 
      53             : #include <linux/errno.h>
      54             : #include <linux/time.h>
      55             : #include <linux/proc_fs.h>
      56             : #include <linux/stat.h>
      57             : #include <linux/task_io_accounting_ops.h>
      58             : #include <linux/init.h>
      59             : #include <linux/capability.h>
      60             : #include <linux/file.h>
      61             : #include <linux/fdtable.h>
      62             : #include <linux/generic-radix-tree.h>
      63             : #include <linux/string.h>
      64             : #include <linux/seq_file.h>
      65             : #include <linux/namei.h>
      66             : #include <linux/mnt_namespace.h>
      67             : #include <linux/mm.h>
      68             : #include <linux/swap.h>
      69             : #include <linux/rcupdate.h>
      70             : #include <linux/kallsyms.h>
      71             : #include <linux/stacktrace.h>
      72             : #include <linux/resource.h>
      73             : #include <linux/module.h>
      74             : #include <linux/mount.h>
      75             : #include <linux/security.h>
      76             : #include <linux/ptrace.h>
      77             : #include <linux/printk.h>
      78             : #include <linux/cache.h>
      79             : #include <linux/cgroup.h>
      80             : #include <linux/cpuset.h>
      81             : #include <linux/audit.h>
      82             : #include <linux/poll.h>
      83             : #include <linux/nsproxy.h>
      84             : #include <linux/oom.h>
      85             : #include <linux/elf.h>
      86             : #include <linux/pid_namespace.h>
      87             : #include <linux/user_namespace.h>
      88             : #include <linux/fs_struct.h>
      89             : #include <linux/slab.h>
      90             : #include <linux/sched/autogroup.h>
      91             : #include <linux/sched/mm.h>
      92             : #include <linux/sched/coredump.h>
      93             : #include <linux/sched/debug.h>
      94             : #include <linux/sched/stat.h>
      95             : #include <linux/posix-timers.h>
      96             : #include <linux/time_namespace.h>
      97             : #include <linux/resctrl.h>
      98             : #include <linux/cn_proc.h>
      99             : #include <trace/events/oom.h>
     100             : #include "internal.h"
     101             : #include "fd.h"
     102             : 
     103             : #include "../../lib/kstrtox.h"
     104             : 
     105             : /* NOTE:
     106             :  *      Implementing inode permission operations in /proc is almost
     107             :  *      certainly an error.  Permission checks need to happen during
     108             :  *      each system call not at open time.  The reason is that most of
     109             :  *      what we wish to check for permissions in /proc varies at runtime.
     110             :  *
     111             :  *      The classic example of a problem is opening file descriptors
     112             :  *      in /proc for a task before it execs a suid executable.
     113             :  */
     114             : 
     115             : static u8 nlink_tid __ro_after_init;
     116             : static u8 nlink_tgid __ro_after_init;
     117             : 
     118             : struct pid_entry {
     119             :         const char *name;
     120             :         unsigned int len;
     121             :         umode_t mode;
     122             :         const struct inode_operations *iop;
     123             :         const struct file_operations *fop;
     124             :         union proc_op op;
     125             : };
     126             : 
     127             : #define NOD(NAME, MODE, IOP, FOP, OP) {                 \
     128             :         .name = (NAME),                                 \
     129             :         .len  = sizeof(NAME) - 1,                       \
     130             :         .mode = MODE,                                   \
     131             :         .iop  = IOP,                                    \
     132             :         .fop  = FOP,                                    \
     133             :         .op   = OP,                                     \
     134             : }
     135             : 
     136             : #define DIR(NAME, MODE, iops, fops)     \
     137             :         NOD(NAME, (S_IFDIR|(MODE)), &iops, &fops, {} )
     138             : #define LNK(NAME, get_link)                                     \
     139             :         NOD(NAME, (S_IFLNK|S_IRWXUGO),                          \
     140             :                 &proc_pid_link_inode_operations, NULL,              \
     141             :                 { .proc_get_link = get_link } )
     142             : #define REG(NAME, MODE, fops)                           \
     143             :         NOD(NAME, (S_IFREG|(MODE)), NULL, &fops, {})
     144             : #define ONE(NAME, MODE, show)                           \
     145             :         NOD(NAME, (S_IFREG|(MODE)),                     \
     146             :                 NULL, &proc_single_file_operations, \
     147             :                 { .proc_show = show } )
     148             : #define ATTR(LSM, NAME, MODE)                           \
     149             :         NOD(NAME, (S_IFREG|(MODE)),                     \
     150             :                 NULL, &proc_pid_attr_operations,    \
     151             :                 { .lsm = LSM })
     152             : 
     153             : /*
     154             :  * Count the number of hardlinks for the pid_entry table, excluding the .
     155             :  * and .. links.
     156             :  */
     157           2 : static unsigned int __init pid_entry_nlink(const struct pid_entry *entries,
     158             :         unsigned int n)
     159             : {
     160             :         unsigned int i;
     161             :         unsigned int count;
     162             : 
     163           2 :         count = 2;
     164          65 :         for (i = 0; i < n; ++i) {
     165          63 :                 if (S_ISDIR(entries[i].mode))
     166           8 :                         ++count;
     167             :         }
     168             : 
     169           2 :         return count;
     170             : }
     171             : 
     172             : static int get_task_root(struct task_struct *task, struct path *root)
     173             : {
     174           0 :         int result = -ENOENT;
     175             : 
     176           0 :         task_lock(task);
     177             :         if (task->fs) {
     178           0 :                 get_fs_root(task->fs, root);
     179           0 :                 result = 0;
     180             :         }
     181           0 :         task_unlock(task);
     182             :         return result;
     183             : }
     184             : 
     185           0 : static int proc_cwd_link(struct dentry *dentry, struct path *path)
     186             : {
     187           0 :         struct task_struct *task = get_proc_task(d_inode(dentry));
     188           0 :         int result = -ENOENT;
     189             : 
     190           0 :         if (task) {
     191             :                 task_lock(task);
     192           0 :                 if (task->fs) {
     193           0 :                         get_fs_pwd(task->fs, path);
     194           0 :                         result = 0;
     195             :                 }
     196             :                 task_unlock(task);
     197           0 :                 put_task_struct(task);
     198             :         }
     199           0 :         return result;
     200             : }
     201             : 
     202           0 : static int proc_root_link(struct dentry *dentry, struct path *path)
     203             : {
     204           0 :         struct task_struct *task = get_proc_task(d_inode(dentry));
     205           0 :         int result = -ENOENT;
     206             : 
     207           0 :         if (task) {
     208           0 :                 result = get_task_root(task, path);
     209           0 :                 put_task_struct(task);
     210             :         }
     211           0 :         return result;
     212             : }
     213             : 
     214             : /*
     215             :  * If the user used setproctitle(), we just get the string from
     216             :  * user space at arg_start, and limit it to a maximum of one page.
     217             :  */
     218           0 : static ssize_t get_mm_proctitle(struct mm_struct *mm, char __user *buf,
     219             :                                 size_t count, unsigned long pos,
     220             :                                 unsigned long arg_start)
     221             : {
     222             :         char *page;
     223             :         int ret, got;
     224             : 
     225           0 :         if (pos >= PAGE_SIZE)
     226             :                 return 0;
     227             : 
     228           0 :         page = (char *)__get_free_page(GFP_KERNEL);
     229           0 :         if (!page)
     230             :                 return -ENOMEM;
     231             : 
     232           0 :         ret = 0;
     233           0 :         got = access_remote_vm(mm, arg_start, page, PAGE_SIZE, FOLL_ANON);
     234           0 :         if (got > 0) {
     235           0 :                 int len = strnlen(page, got);
     236             : 
     237             :                 /* Include the NUL character if it was found */
     238           0 :                 if (len < got)
     239           0 :                         len++;
     240             : 
     241           0 :                 if (len > pos) {
     242           0 :                         len -= pos;
     243           0 :                         if (len > count)
     244           0 :                                 len = count;
     245           0 :                         len -= copy_to_user(buf, page+pos, len);
     246           0 :                         if (!len)
     247           0 :                                 len = -EFAULT;
     248             :                         ret = len;
     249             :                 }
     250             :         }
     251           0 :         free_page((unsigned long)page);
     252           0 :         return ret;
     253             : }
     254             : 
     255           0 : static ssize_t get_mm_cmdline(struct mm_struct *mm, char __user *buf,
     256             :                               size_t count, loff_t *ppos)
     257             : {
     258             :         unsigned long arg_start, arg_end, env_start, env_end;
     259             :         unsigned long pos, len;
     260             :         char *page, c;
     261             : 
     262             :         /* Check if process spawned far enough to have cmdline. */
     263           0 :         if (!mm->env_end)
     264             :                 return 0;
     265             : 
     266           0 :         spin_lock(&mm->arg_lock);
     267           0 :         arg_start = mm->arg_start;
     268           0 :         arg_end = mm->arg_end;
     269           0 :         env_start = mm->env_start;
     270           0 :         env_end = mm->env_end;
     271           0 :         spin_unlock(&mm->arg_lock);
     272             : 
     273           0 :         if (arg_start >= arg_end)
     274             :                 return 0;
     275             : 
     276             :         /*
     277             :          * We allow setproctitle() to overwrite the argument
     278             :          * strings, and overflow past the original end. But
     279             :          * only when it overflows into the environment area.
     280             :          */
     281           0 :         if (env_start != arg_end || env_end < env_start)
     282           0 :                 env_start = env_end = arg_end;
     283           0 :         len = env_end - arg_start;
     284             : 
     285             :         /* We're not going to care if "*ppos" has high bits set */
     286           0 :         pos = *ppos;
     287           0 :         if (pos >= len)
     288             :                 return 0;
     289           0 :         if (count > len - pos)
     290           0 :                 count = len - pos;
     291           0 :         if (!count)
     292             :                 return 0;
     293             : 
     294             :         /*
     295             :          * Magical special case: if the argv[] end byte is not
     296             :          * zero, the user has overwritten it with setproctitle(3).
     297             :          *
     298             :          * Possible future enhancement: do this only once when
     299             :          * pos is 0, and set a flag in the 'struct file'.
     300             :          */
     301           0 :         if (access_remote_vm(mm, arg_end-1, &c, 1, FOLL_ANON) == 1 && c)
     302           0 :                 return get_mm_proctitle(mm, buf, count, pos, arg_start);
     303             : 
     304             :         /*
     305             :          * For the non-setproctitle() case we limit things strictly
     306             :          * to the [arg_start, arg_end[ range.
     307             :          */
     308           0 :         pos += arg_start;
     309           0 :         if (pos < arg_start || pos >= arg_end)
     310             :                 return 0;
     311           0 :         if (count > arg_end - pos)
     312           0 :                 count = arg_end - pos;
     313             : 
     314           0 :         page = (char *)__get_free_page(GFP_KERNEL);
     315           0 :         if (!page)
     316             :                 return -ENOMEM;
     317             : 
     318             :         len = 0;
     319           0 :         while (count) {
     320             :                 int got;
     321           0 :                 size_t size = min_t(size_t, PAGE_SIZE, count);
     322             : 
     323           0 :                 got = access_remote_vm(mm, pos, page, size, FOLL_ANON);
     324           0 :                 if (got <= 0)
     325             :                         break;
     326           0 :                 got -= copy_to_user(buf, page, got);
     327           0 :                 if (unlikely(!got)) {
     328           0 :                         if (!len)
     329           0 :                                 len = -EFAULT;
     330             :                         break;
     331             :                 }
     332           0 :                 pos += got;
     333           0 :                 buf += got;
     334           0 :                 len += got;
     335           0 :                 count -= got;
     336             :         }
     337             : 
     338           0 :         free_page((unsigned long)page);
     339           0 :         return len;
     340             : }
     341             : 
     342           0 : static ssize_t get_task_cmdline(struct task_struct *tsk, char __user *buf,
     343             :                                 size_t count, loff_t *pos)
     344             : {
     345             :         struct mm_struct *mm;
     346             :         ssize_t ret;
     347             : 
     348           0 :         mm = get_task_mm(tsk);
     349           0 :         if (!mm)
     350             :                 return 0;
     351             : 
     352           0 :         ret = get_mm_cmdline(mm, buf, count, pos);
     353           0 :         mmput(mm);
     354           0 :         return ret;
     355             : }
     356             : 
     357           0 : static ssize_t proc_pid_cmdline_read(struct file *file, char __user *buf,
     358             :                                      size_t count, loff_t *pos)
     359             : {
     360             :         struct task_struct *tsk;
     361             :         ssize_t ret;
     362             : 
     363           0 :         BUG_ON(*pos < 0);
     364             : 
     365           0 :         tsk = get_proc_task(file_inode(file));
     366           0 :         if (!tsk)
     367             :                 return -ESRCH;
     368           0 :         ret = get_task_cmdline(tsk, buf, count, pos);
     369           0 :         put_task_struct(tsk);
     370           0 :         if (ret > 0)
     371           0 :                 *pos += ret;
     372             :         return ret;
     373             : }
     374             : 
     375             : static const struct file_operations proc_pid_cmdline_ops = {
     376             :         .read   = proc_pid_cmdline_read,
     377             :         .llseek = generic_file_llseek,
     378             : };
     379             : 
     380             : #ifdef CONFIG_KALLSYMS
     381             : /*
     382             :  * Provides a wchan file via kallsyms in a proper one-value-per-file format.
     383             :  * Returns the resolved symbol.  If that fails, simply return the address.
     384             :  */
     385           0 : static int proc_pid_wchan(struct seq_file *m, struct pid_namespace *ns,
     386             :                           struct pid *pid, struct task_struct *task)
     387             : {
     388             :         unsigned long wchan;
     389             :         char symname[KSYM_NAME_LEN];
     390             : 
     391           0 :         if (!ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS))
     392             :                 goto print0;
     393             : 
     394           0 :         wchan = get_wchan(task);
     395           0 :         if (wchan && !lookup_symbol_name(wchan, symname)) {
     396           0 :                 seq_puts(m, symname);
     397           0 :                 return 0;
     398             :         }
     399             : 
     400             : print0:
     401           0 :         seq_putc(m, '0');
     402           0 :         return 0;
     403             : }
     404             : #endif /* CONFIG_KALLSYMS */
     405             : 
     406           0 : static int lock_trace(struct task_struct *task)
     407             : {
     408           0 :         int err = down_read_killable(&task->signal->exec_update_lock);
     409           0 :         if (err)
     410             :                 return err;
     411           0 :         if (!ptrace_may_access(task, PTRACE_MODE_ATTACH_FSCREDS)) {
     412           0 :                 up_read(&task->signal->exec_update_lock);
     413           0 :                 return -EPERM;
     414             :         }
     415             :         return 0;
     416             : }
     417             : 
     418             : static void unlock_trace(struct task_struct *task)
     419             : {
     420           0 :         up_read(&task->signal->exec_update_lock);
     421             : }
     422             : 
     423             : #ifdef CONFIG_STACKTRACE
     424             : 
     425             : #define MAX_STACK_TRACE_DEPTH   64
     426             : 
     427           0 : static int proc_pid_stack(struct seq_file *m, struct pid_namespace *ns,
     428             :                           struct pid *pid, struct task_struct *task)
     429             : {
     430             :         unsigned long *entries;
     431             :         int err;
     432             : 
     433             :         /*
     434             :          * The ability to racily run the kernel stack unwinder on a running task
     435             :          * and then observe the unwinder output is scary; while it is useful for
     436             :          * debugging kernel issues, it can also allow an attacker to leak kernel
     437             :          * stack contents.
     438             :          * Doing this in a manner that is at least safe from races would require
     439             :          * some work to ensure that the remote task can not be scheduled; and
     440             :          * even then, this would still expose the unwinder as local attack
     441             :          * surface.
     442             :          * Therefore, this interface is restricted to root.
     443             :          */
     444           0 :         if (!file_ns_capable(m->file, &init_user_ns, CAP_SYS_ADMIN))
     445             :                 return -EACCES;
     446             : 
     447           0 :         entries = kmalloc_array(MAX_STACK_TRACE_DEPTH, sizeof(*entries),
     448             :                                 GFP_KERNEL);
     449           0 :         if (!entries)
     450             :                 return -ENOMEM;
     451             : 
     452           0 :         err = lock_trace(task);
     453           0 :         if (!err) {
     454             :                 unsigned int i, nr_entries;
     455             : 
     456           0 :                 nr_entries = stack_trace_save_tsk(task, entries,
     457             :                                                   MAX_STACK_TRACE_DEPTH, 0);
     458             : 
     459           0 :                 for (i = 0; i < nr_entries; i++) {
     460           0 :                         seq_printf(m, "[<0>] %pB\n", (void *)entries[i]);
     461             :                 }
     462             : 
     463           0 :                 unlock_trace(task);
     464             :         }
     465           0 :         kfree(entries);
     466             : 
     467           0 :         return err;
     468             : }
     469             : #endif
     470             : 
     471             : #ifdef CONFIG_SCHED_INFO
     472             : /*
     473             :  * Provides /proc/PID/schedstat
     474             :  */
     475             : static int proc_pid_schedstat(struct seq_file *m, struct pid_namespace *ns,
     476             :                               struct pid *pid, struct task_struct *task)
     477             : {
     478             :         if (unlikely(!sched_info_on()))
     479             :                 seq_puts(m, "0 0 0\n");
     480             :         else
     481             :                 seq_printf(m, "%llu %llu %lu\n",
     482             :                    (unsigned long long)task->se.sum_exec_runtime,
     483             :                    (unsigned long long)task->sched_info.run_delay,
     484             :                    task->sched_info.pcount);
     485             : 
     486             :         return 0;
     487             : }
     488             : #endif
     489             : 
     490             : #ifdef CONFIG_LATENCYTOP
     491             : static int lstats_show_proc(struct seq_file *m, void *v)
     492             : {
     493             :         int i;
     494             :         struct inode *inode = m->private;
     495             :         struct task_struct *task = get_proc_task(inode);
     496             : 
     497             :         if (!task)
     498             :                 return -ESRCH;
     499             :         seq_puts(m, "Latency Top version : v0.1\n");
     500             :         for (i = 0; i < LT_SAVECOUNT; i++) {
     501             :                 struct latency_record *lr = &task->latency_record[i];
     502             :                 if (lr->backtrace[0]) {
     503             :                         int q;
     504             :                         seq_printf(m, "%i %li %li",
     505             :                                    lr->count, lr->time, lr->max);
     506             :                         for (q = 0; q < LT_BACKTRACEDEPTH; q++) {
     507             :                                 unsigned long bt = lr->backtrace[q];
     508             : 
     509             :                                 if (!bt)
     510             :                                         break;
     511             :                                 seq_printf(m, " %ps", (void *)bt);
     512             :                         }
     513             :                         seq_putc(m, '\n');
     514             :                 }
     515             : 
     516             :         }
     517             :         put_task_struct(task);
     518             :         return 0;
     519             : }
     520             : 
     521             : static int lstats_open(struct inode *inode, struct file *file)
     522             : {
     523             :         return single_open(file, lstats_show_proc, inode);
     524             : }
     525             : 
     526             : static ssize_t lstats_write(struct file *file, const char __user *buf,
     527             :                             size_t count, loff_t *offs)
     528             : {
     529             :         struct task_struct *task = get_proc_task(file_inode(file));
     530             : 
     531             :         if (!task)
     532             :                 return -ESRCH;
     533             :         clear_tsk_latency_tracing(task);
     534             :         put_task_struct(task);
     535             : 
     536             :         return count;
     537             : }
     538             : 
     539             : static const struct file_operations proc_lstats_operations = {
     540             :         .open           = lstats_open,
     541             :         .read           = seq_read,
     542             :         .write          = lstats_write,
     543             :         .llseek         = seq_lseek,
     544             :         .release        = single_release,
     545             : };
     546             : 
     547             : #endif
     548             : 
     549           0 : static int proc_oom_score(struct seq_file *m, struct pid_namespace *ns,
     550             :                           struct pid *pid, struct task_struct *task)
     551             : {
     552           0 :         unsigned long totalpages = totalram_pages() + total_swap_pages;
     553           0 :         unsigned long points = 0;
     554             :         long badness;
     555             : 
     556           0 :         badness = oom_badness(task, totalpages);
     557             :         /*
     558             :          * Special case OOM_SCORE_ADJ_MIN for all others scale the
     559             :          * badness value into [0, 2000] range which we have been
     560             :          * exporting for a long time so userspace might depend on it.
     561             :          */
     562           0 :         if (badness != LONG_MIN)
     563           0 :                 points = (1000 + badness * 1000 / (long)totalpages) * 2 / 3;
     564             : 
     565           0 :         seq_printf(m, "%lu\n", points);
     566             : 
     567           0 :         return 0;
     568             : }
     569             : 
     570             : struct limit_names {
     571             :         const char *name;
     572             :         const char *unit;
     573             : };
     574             : 
     575             : static const struct limit_names lnames[RLIM_NLIMITS] = {
     576             :         [RLIMIT_CPU] = {"Max cpu time", "seconds"},
     577             :         [RLIMIT_FSIZE] = {"Max file size", "bytes"},
     578             :         [RLIMIT_DATA] = {"Max data size", "bytes"},
     579             :         [RLIMIT_STACK] = {"Max stack size", "bytes"},
     580             :         [RLIMIT_CORE] = {"Max core file size", "bytes"},
     581             :         [RLIMIT_RSS] = {"Max resident set", "bytes"},
     582             :         [RLIMIT_NPROC] = {"Max processes", "processes"},
     583             :         [RLIMIT_NOFILE] = {"Max open files", "files"},
     584             :         [RLIMIT_MEMLOCK] = {"Max locked memory", "bytes"},
     585             :         [RLIMIT_AS] = {"Max address space", "bytes"},
     586             :         [RLIMIT_LOCKS] = {"Max file locks", "locks"},
     587             :         [RLIMIT_SIGPENDING] = {"Max pending signals", "signals"},
     588             :         [RLIMIT_MSGQUEUE] = {"Max msgqueue size", "bytes"},
     589             :         [RLIMIT_NICE] = {"Max nice priority", NULL},
     590             :         [RLIMIT_RTPRIO] = {"Max realtime priority", NULL},
     591             :         [RLIMIT_RTTIME] = {"Max realtime timeout", "us"},
     592             : };
     593             : 
     594             : /* Display limits for a process */
     595           0 : static int proc_pid_limits(struct seq_file *m, struct pid_namespace *ns,
     596             :                            struct pid *pid, struct task_struct *task)
     597             : {
     598             :         unsigned int i;
     599             :         unsigned long flags;
     600             : 
     601             :         struct rlimit rlim[RLIM_NLIMITS];
     602             : 
     603           0 :         if (!lock_task_sighand(task, &flags))
     604             :                 return 0;
     605           0 :         memcpy(rlim, task->signal->rlim, sizeof(struct rlimit) * RLIM_NLIMITS);
     606           0 :         unlock_task_sighand(task, &flags);
     607             : 
     608             :         /*
     609             :          * print the file header
     610             :          */
     611           0 :         seq_puts(m, "Limit                     "
     612             :                 "Soft Limit           "
     613             :                 "Hard Limit           "
     614             :                 "Units     \n");
     615             : 
     616           0 :         for (i = 0; i < RLIM_NLIMITS; i++) {
     617           0 :                 if (rlim[i].rlim_cur == RLIM_INFINITY)
     618           0 :                         seq_printf(m, "%-25s %-20s ",
     619             :                                    lnames[i].name, "unlimited");
     620             :                 else
     621           0 :                         seq_printf(m, "%-25s %-20lu ",
     622             :                                    lnames[i].name, rlim[i].rlim_cur);
     623             : 
     624           0 :                 if (rlim[i].rlim_max == RLIM_INFINITY)
     625           0 :                         seq_printf(m, "%-20s ", "unlimited");
     626             :                 else
     627           0 :                         seq_printf(m, "%-20lu ", rlim[i].rlim_max);
     628             : 
     629           0 :                 if (lnames[i].unit)
     630           0 :                         seq_printf(m, "%-10s\n", lnames[i].unit);
     631             :                 else
     632           0 :                         seq_putc(m, '\n');
     633             :         }
     634             : 
     635             :         return 0;
     636             : }
     637             : 
     638             : #ifdef CONFIG_HAVE_ARCH_TRACEHOOK
     639             : static int proc_pid_syscall(struct seq_file *m, struct pid_namespace *ns,
     640             :                             struct pid *pid, struct task_struct *task)
     641             : {
     642             :         struct syscall_info info;
     643             :         u64 *args = &info.data.args[0];
     644             :         int res;
     645             : 
     646             :         res = lock_trace(task);
     647             :         if (res)
     648             :                 return res;
     649             : 
     650             :         if (task_current_syscall(task, &info))
     651             :                 seq_puts(m, "running\n");
     652             :         else if (info.data.nr < 0)
     653             :                 seq_printf(m, "%d 0x%llx 0x%llx\n",
     654             :                            info.data.nr, info.sp, info.data.instruction_pointer);
     655             :         else
     656             :                 seq_printf(m,
     657             :                        "%d 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx\n",
     658             :                        info.data.nr,
     659             :                        args[0], args[1], args[2], args[3], args[4], args[5],
     660             :                        info.sp, info.data.instruction_pointer);
     661             :         unlock_trace(task);
     662             : 
     663             :         return 0;
     664             : }
     665             : #endif /* CONFIG_HAVE_ARCH_TRACEHOOK */
     666             : 
     667             : /************************************************************************/
     668             : /*                       Here the fs part begins                        */
     669             : /************************************************************************/
     670             : 
     671             : /* permission checks */
     672           0 : static bool proc_fd_access_allowed(struct inode *inode)
     673             : {
     674             :         struct task_struct *task;
     675           0 :         bool allowed = false;
     676             :         /* Allow access to a task's file descriptors if it is us or we
     677             :          * may use ptrace attach to the process and find out that
     678             :          * information.
     679             :          */
     680           0 :         task = get_proc_task(inode);
     681           0 :         if (task) {
     682           0 :                 allowed = ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS);
     683           0 :                 put_task_struct(task);
     684             :         }
     685           0 :         return allowed;
     686             : }
     687             : 
     688           0 : int proc_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
     689             :                  struct iattr *attr)
     690             : {
     691             :         int error;
     692           0 :         struct inode *inode = d_inode(dentry);
     693             : 
     694           0 :         if (attr->ia_valid & ATTR_MODE)
     695             :                 return -EPERM;
     696             : 
     697           0 :         error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
     698           0 :         if (error)
     699             :                 return error;
     700             : 
     701           0 :         setattr_copy(&nop_mnt_idmap, inode, attr);
     702           0 :         mark_inode_dirty(inode);
     703           0 :         return 0;
     704             : }
     705             : 
     706             : /*
     707             :  * May current process learn task's sched/cmdline info (for hide_pid_min=1)
     708             :  * or euid/egid (for hide_pid_min=2)?
     709             :  */
     710           0 : static bool has_pid_permissions(struct proc_fs_info *fs_info,
     711             :                                  struct task_struct *task,
     712             :                                  enum proc_hidepid hide_pid_min)
     713             : {
     714             :         /*
     715             :          * If 'hidpid' mount option is set force a ptrace check,
     716             :          * we indicate that we are using a filesystem syscall
     717             :          * by passing PTRACE_MODE_READ_FSCREDS
     718             :          */
     719           0 :         if (fs_info->hide_pid == HIDEPID_NOT_PTRACEABLE)
     720           0 :                 return ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS);
     721             : 
     722           0 :         if (fs_info->hide_pid < hide_pid_min)
     723             :                 return true;
     724           0 :         if (in_group_p(fs_info->pid_gid))
     725             :                 return true;
     726           0 :         return ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS);
     727             : }
     728             : 
     729             : 
     730           0 : static int proc_pid_permission(struct mnt_idmap *idmap,
     731             :                                struct inode *inode, int mask)
     732             : {
     733           0 :         struct proc_fs_info *fs_info = proc_sb_info(inode->i_sb);
     734             :         struct task_struct *task;
     735             :         bool has_perms;
     736             : 
     737           0 :         task = get_proc_task(inode);
     738           0 :         if (!task)
     739             :                 return -ESRCH;
     740           0 :         has_perms = has_pid_permissions(fs_info, task, HIDEPID_NO_ACCESS);
     741           0 :         put_task_struct(task);
     742             : 
     743           0 :         if (!has_perms) {
     744           0 :                 if (fs_info->hide_pid == HIDEPID_INVISIBLE) {
     745             :                         /*
     746             :                          * Let's make getdents(), stat(), and open()
     747             :                          * consistent with each other.  If a process
     748             :                          * may not stat() a file, it shouldn't be seen
     749             :                          * in procfs at all.
     750             :                          */
     751             :                         return -ENOENT;
     752             :                 }
     753             : 
     754           0 :                 return -EPERM;
     755             :         }
     756           0 :         return generic_permission(&nop_mnt_idmap, inode, mask);
     757             : }
     758             : 
     759             : 
     760             : 
     761             : static const struct inode_operations proc_def_inode_operations = {
     762             :         .setattr        = proc_setattr,
     763             : };
     764             : 
     765           0 : static int proc_single_show(struct seq_file *m, void *v)
     766             : {
     767           0 :         struct inode *inode = m->private;
     768           0 :         struct pid_namespace *ns = proc_pid_ns(inode->i_sb);
     769           0 :         struct pid *pid = proc_pid(inode);
     770             :         struct task_struct *task;
     771             :         int ret;
     772             : 
     773           0 :         task = get_pid_task(pid, PIDTYPE_PID);
     774           0 :         if (!task)
     775             :                 return -ESRCH;
     776             : 
     777           0 :         ret = PROC_I(inode)->op.proc_show(m, ns, pid, task);
     778             : 
     779           0 :         put_task_struct(task);
     780           0 :         return ret;
     781             : }
     782             : 
     783           0 : static int proc_single_open(struct inode *inode, struct file *filp)
     784             : {
     785           0 :         return single_open(filp, proc_single_show, inode);
     786             : }
     787             : 
     788             : static const struct file_operations proc_single_file_operations = {
     789             :         .open           = proc_single_open,
     790             :         .read           = seq_read,
     791             :         .llseek         = seq_lseek,
     792             :         .release        = single_release,
     793             : };
     794             : 
     795             : 
     796           0 : struct mm_struct *proc_mem_open(struct inode *inode, unsigned int mode)
     797             : {
     798           0 :         struct task_struct *task = get_proc_task(inode);
     799           0 :         struct mm_struct *mm = ERR_PTR(-ESRCH);
     800             : 
     801           0 :         if (task) {
     802           0 :                 mm = mm_access(task, mode | PTRACE_MODE_FSCREDS);
     803           0 :                 put_task_struct(task);
     804             : 
     805           0 :                 if (!IS_ERR_OR_NULL(mm)) {
     806             :                         /* ensure this mm_struct can't be freed */
     807           0 :                         mmgrab(mm);
     808             :                         /* but do not pin its memory */
     809           0 :                         mmput(mm);
     810             :                 }
     811             :         }
     812             : 
     813           0 :         return mm;
     814             : }
     815             : 
     816             : static int __mem_open(struct inode *inode, struct file *file, unsigned int mode)
     817             : {
     818           0 :         struct mm_struct *mm = proc_mem_open(inode, mode);
     819             : 
     820           0 :         if (IS_ERR(mm))
     821           0 :                 return PTR_ERR(mm);
     822             : 
     823           0 :         file->private_data = mm;
     824             :         return 0;
     825             : }
     826             : 
     827           0 : static int mem_open(struct inode *inode, struct file *file)
     828             : {
     829           0 :         int ret = __mem_open(inode, file, PTRACE_MODE_ATTACH);
     830             : 
     831             :         /* OK to pass negative loff_t, we can catch out-of-range */
     832           0 :         file->f_mode |= FMODE_UNSIGNED_OFFSET;
     833             : 
     834           0 :         return ret;
     835             : }
     836             : 
     837           0 : static ssize_t mem_rw(struct file *file, char __user *buf,
     838             :                         size_t count, loff_t *ppos, int write)
     839             : {
     840           0 :         struct mm_struct *mm = file->private_data;
     841           0 :         unsigned long addr = *ppos;
     842             :         ssize_t copied;
     843             :         char *page;
     844             :         unsigned int flags;
     845             : 
     846           0 :         if (!mm)
     847             :                 return 0;
     848             : 
     849           0 :         page = (char *)__get_free_page(GFP_KERNEL);
     850           0 :         if (!page)
     851             :                 return -ENOMEM;
     852             : 
     853           0 :         copied = 0;
     854           0 :         if (!mmget_not_zero(mm))
     855             :                 goto free;
     856             : 
     857           0 :         flags = FOLL_FORCE | (write ? FOLL_WRITE : 0);
     858             : 
     859           0 :         while (count > 0) {
     860           0 :                 size_t this_len = min_t(size_t, count, PAGE_SIZE);
     861             : 
     862           0 :                 if (write && copy_from_user(page, buf, this_len)) {
     863             :                         copied = -EFAULT;
     864             :                         break;
     865             :                 }
     866             : 
     867           0 :                 this_len = access_remote_vm(mm, addr, page, this_len, flags);
     868           0 :                 if (!this_len) {
     869           0 :                         if (!copied)
     870           0 :                                 copied = -EIO;
     871             :                         break;
     872             :                 }
     873             : 
     874           0 :                 if (!write && copy_to_user(buf, page, this_len)) {
     875             :                         copied = -EFAULT;
     876             :                         break;
     877             :                 }
     878             : 
     879           0 :                 buf += this_len;
     880           0 :                 addr += this_len;
     881           0 :                 copied += this_len;
     882           0 :                 count -= this_len;
     883             :         }
     884           0 :         *ppos = addr;
     885             : 
     886           0 :         mmput(mm);
     887             : free:
     888           0 :         free_page((unsigned long) page);
     889             :         return copied;
     890             : }
     891             : 
     892           0 : static ssize_t mem_read(struct file *file, char __user *buf,
     893             :                         size_t count, loff_t *ppos)
     894             : {
     895           0 :         return mem_rw(file, buf, count, ppos, 0);
     896             : }
     897             : 
     898           0 : static ssize_t mem_write(struct file *file, const char __user *buf,
     899             :                          size_t count, loff_t *ppos)
     900             : {
     901           0 :         return mem_rw(file, (char __user*)buf, count, ppos, 1);
     902             : }
     903             : 
     904           0 : loff_t mem_lseek(struct file *file, loff_t offset, int orig)
     905             : {
     906           0 :         switch (orig) {
     907             :         case 0:
     908           0 :                 file->f_pos = offset;
     909           0 :                 break;
     910             :         case 1:
     911           0 :                 file->f_pos += offset;
     912           0 :                 break;
     913             :         default:
     914             :                 return -EINVAL;
     915             :         }
     916             :         force_successful_syscall_return();
     917           0 :         return file->f_pos;
     918             : }
     919             : 
     920           0 : static int mem_release(struct inode *inode, struct file *file)
     921             : {
     922           0 :         struct mm_struct *mm = file->private_data;
     923           0 :         if (mm)
     924             :                 mmdrop(mm);
     925           0 :         return 0;
     926             : }
     927             : 
     928             : static const struct file_operations proc_mem_operations = {
     929             :         .llseek         = mem_lseek,
     930             :         .read           = mem_read,
     931             :         .write          = mem_write,
     932             :         .open           = mem_open,
     933             :         .release        = mem_release,
     934             : };
     935             : 
     936           0 : static int environ_open(struct inode *inode, struct file *file)
     937             : {
     938           0 :         return __mem_open(inode, file, PTRACE_MODE_READ);
     939             : }
     940             : 
     941           0 : static ssize_t environ_read(struct file *file, char __user *buf,
     942             :                         size_t count, loff_t *ppos)
     943             : {
     944             :         char *page;
     945           0 :         unsigned long src = *ppos;
     946           0 :         int ret = 0;
     947           0 :         struct mm_struct *mm = file->private_data;
     948             :         unsigned long env_start, env_end;
     949             : 
     950             :         /* Ensure the process spawned far enough to have an environment. */
     951           0 :         if (!mm || !mm->env_end)
     952             :                 return 0;
     953             : 
     954           0 :         page = (char *)__get_free_page(GFP_KERNEL);
     955           0 :         if (!page)
     956             :                 return -ENOMEM;
     957             : 
     958           0 :         ret = 0;
     959           0 :         if (!mmget_not_zero(mm))
     960             :                 goto free;
     961             : 
     962           0 :         spin_lock(&mm->arg_lock);
     963           0 :         env_start = mm->env_start;
     964           0 :         env_end = mm->env_end;
     965           0 :         spin_unlock(&mm->arg_lock);
     966             : 
     967           0 :         while (count > 0) {
     968             :                 size_t this_len, max_len;
     969             :                 int retval;
     970             : 
     971           0 :                 if (src >= (env_end - env_start))
     972             :                         break;
     973             : 
     974           0 :                 this_len = env_end - (env_start + src);
     975             : 
     976           0 :                 max_len = min_t(size_t, PAGE_SIZE, count);
     977           0 :                 this_len = min(max_len, this_len);
     978             : 
     979           0 :                 retval = access_remote_vm(mm, (env_start + src), page, this_len, FOLL_ANON);
     980             : 
     981           0 :                 if (retval <= 0) {
     982             :                         ret = retval;
     983             :                         break;
     984             :                 }
     985             : 
     986           0 :                 if (copy_to_user(buf, page, retval)) {
     987             :                         ret = -EFAULT;
     988             :                         break;
     989             :                 }
     990             : 
     991           0 :                 ret += retval;
     992           0 :                 src += retval;
     993           0 :                 buf += retval;
     994           0 :                 count -= retval;
     995             :         }
     996           0 :         *ppos = src;
     997           0 :         mmput(mm);
     998             : 
     999             : free:
    1000           0 :         free_page((unsigned long) page);
    1001           0 :         return ret;
    1002             : }
    1003             : 
    1004             : static const struct file_operations proc_environ_operations = {
    1005             :         .open           = environ_open,
    1006             :         .read           = environ_read,
    1007             :         .llseek         = generic_file_llseek,
    1008             :         .release        = mem_release,
    1009             : };
    1010             : 
    1011           0 : static int auxv_open(struct inode *inode, struct file *file)
    1012             : {
    1013           0 :         return __mem_open(inode, file, PTRACE_MODE_READ_FSCREDS);
    1014             : }
    1015             : 
    1016           0 : static ssize_t auxv_read(struct file *file, char __user *buf,
    1017             :                         size_t count, loff_t *ppos)
    1018             : {
    1019           0 :         struct mm_struct *mm = file->private_data;
    1020           0 :         unsigned int nwords = 0;
    1021             : 
    1022           0 :         if (!mm)
    1023             :                 return 0;
    1024             :         do {
    1025           0 :                 nwords += 2;
    1026           0 :         } while (mm->saved_auxv[nwords - 2] != 0); /* AT_NULL */
    1027           0 :         return simple_read_from_buffer(buf, count, ppos, mm->saved_auxv,
    1028             :                                        nwords * sizeof(mm->saved_auxv[0]));
    1029             : }
    1030             : 
    1031             : static const struct file_operations proc_auxv_operations = {
    1032             :         .open           = auxv_open,
    1033             :         .read           = auxv_read,
    1034             :         .llseek         = generic_file_llseek,
    1035             :         .release        = mem_release,
    1036             : };
    1037             : 
    1038           0 : static ssize_t oom_adj_read(struct file *file, char __user *buf, size_t count,
    1039             :                             loff_t *ppos)
    1040             : {
    1041           0 :         struct task_struct *task = get_proc_task(file_inode(file));
    1042             :         char buffer[PROC_NUMBUF];
    1043           0 :         int oom_adj = OOM_ADJUST_MIN;
    1044             :         size_t len;
    1045             : 
    1046           0 :         if (!task)
    1047             :                 return -ESRCH;
    1048           0 :         if (task->signal->oom_score_adj == OOM_SCORE_ADJ_MAX)
    1049             :                 oom_adj = OOM_ADJUST_MAX;
    1050             :         else
    1051           0 :                 oom_adj = (task->signal->oom_score_adj * -OOM_DISABLE) /
    1052             :                           OOM_SCORE_ADJ_MAX;
    1053           0 :         put_task_struct(task);
    1054           0 :         if (oom_adj > OOM_ADJUST_MAX)
    1055           0 :                 oom_adj = OOM_ADJUST_MAX;
    1056           0 :         len = snprintf(buffer, sizeof(buffer), "%d\n", oom_adj);
    1057           0 :         return simple_read_from_buffer(buf, count, ppos, buffer, len);
    1058             : }
    1059             : 
    1060           0 : static int __set_oom_adj(struct file *file, int oom_adj, bool legacy)
    1061             : {
    1062           0 :         struct mm_struct *mm = NULL;
    1063             :         struct task_struct *task;
    1064           0 :         int err = 0;
    1065             : 
    1066           0 :         task = get_proc_task(file_inode(file));
    1067           0 :         if (!task)
    1068             :                 return -ESRCH;
    1069             : 
    1070           0 :         mutex_lock(&oom_adj_mutex);
    1071           0 :         if (legacy) {
    1072           0 :                 if (oom_adj < task->signal->oom_score_adj &&
    1073           0 :                                 !capable(CAP_SYS_RESOURCE)) {
    1074             :                         err = -EACCES;
    1075             :                         goto err_unlock;
    1076             :                 }
    1077             :                 /*
    1078             :                  * /proc/pid/oom_adj is provided for legacy purposes, ask users to use
    1079             :                  * /proc/pid/oom_score_adj instead.
    1080             :                  */
    1081           0 :                 pr_warn_once("%s (%d): /proc/%d/oom_adj is deprecated, please use /proc/%d/oom_score_adj instead.\n",
    1082             :                           current->comm, task_pid_nr(current), task_pid_nr(task),
    1083             :                           task_pid_nr(task));
    1084             :         } else {
    1085           0 :                 if ((short)oom_adj < task->signal->oom_score_adj_min &&
    1086           0 :                                 !capable(CAP_SYS_RESOURCE)) {
    1087             :                         err = -EACCES;
    1088             :                         goto err_unlock;
    1089             :                 }
    1090             :         }
    1091             : 
    1092             :         /*
    1093             :          * Make sure we will check other processes sharing the mm if this is
    1094             :          * not vfrok which wants its own oom_score_adj.
    1095             :          * pin the mm so it doesn't go away and get reused after task_unlock
    1096             :          */
    1097           0 :         if (!task->vfork_done) {
    1098           0 :                 struct task_struct *p = find_lock_task_mm(task);
    1099             : 
    1100           0 :                 if (p) {
    1101           0 :                         if (test_bit(MMF_MULTIPROCESS, &p->mm->flags)) {
    1102           0 :                                 mm = p->mm;
    1103             :                                 mmgrab(mm);
    1104             :                         }
    1105           0 :                         task_unlock(p);
    1106             :                 }
    1107             :         }
    1108             : 
    1109           0 :         task->signal->oom_score_adj = oom_adj;
    1110           0 :         if (!legacy && has_capability_noaudit(current, CAP_SYS_RESOURCE))
    1111           0 :                 task->signal->oom_score_adj_min = (short)oom_adj;
    1112             :         trace_oom_score_adj_update(task);
    1113             : 
    1114           0 :         if (mm) {
    1115             :                 struct task_struct *p;
    1116             : 
    1117             :                 rcu_read_lock();
    1118           0 :                 for_each_process(p) {
    1119           0 :                         if (same_thread_group(task, p))
    1120           0 :                                 continue;
    1121             : 
    1122             :                         /* do not touch kernel threads or the global init */
    1123           0 :                         if (p->flags & PF_KTHREAD || is_global_init(p))
    1124           0 :                                 continue;
    1125             : 
    1126           0 :                         task_lock(p);
    1127           0 :                         if (!p->vfork_done && process_shares_mm(p, mm)) {
    1128           0 :                                 p->signal->oom_score_adj = oom_adj;
    1129           0 :                                 if (!legacy && has_capability_noaudit(current, CAP_SYS_RESOURCE))
    1130           0 :                                         p->signal->oom_score_adj_min = (short)oom_adj;
    1131             :                         }
    1132           0 :                         task_unlock(p);
    1133             :                 }
    1134           0 :                 rcu_read_unlock();
    1135             :                 mmdrop(mm);
    1136             :         }
    1137             : err_unlock:
    1138           0 :         mutex_unlock(&oom_adj_mutex);
    1139           0 :         put_task_struct(task);
    1140           0 :         return err;
    1141             : }
    1142             : 
    1143             : /*
    1144             :  * /proc/pid/oom_adj exists solely for backwards compatibility with previous
    1145             :  * kernels.  The effective policy is defined by oom_score_adj, which has a
    1146             :  * different scale: oom_adj grew exponentially and oom_score_adj grows linearly.
    1147             :  * Values written to oom_adj are simply mapped linearly to oom_score_adj.
    1148             :  * Processes that become oom disabled via oom_adj will still be oom disabled
    1149             :  * with this implementation.
    1150             :  *
    1151             :  * oom_adj cannot be removed since existing userspace binaries use it.
    1152             :  */
    1153           0 : static ssize_t oom_adj_write(struct file *file, const char __user *buf,
    1154             :                              size_t count, loff_t *ppos)
    1155             : {
    1156             :         char buffer[PROC_NUMBUF];
    1157             :         int oom_adj;
    1158             :         int err;
    1159             : 
    1160           0 :         memset(buffer, 0, sizeof(buffer));
    1161           0 :         if (count > sizeof(buffer) - 1)
    1162           0 :                 count = sizeof(buffer) - 1;
    1163           0 :         if (copy_from_user(buffer, buf, count)) {
    1164             :                 err = -EFAULT;
    1165             :                 goto out;
    1166             :         }
    1167             : 
    1168           0 :         err = kstrtoint(strstrip(buffer), 0, &oom_adj);
    1169           0 :         if (err)
    1170             :                 goto out;
    1171           0 :         if ((oom_adj < OOM_ADJUST_MIN || oom_adj > OOM_ADJUST_MAX) &&
    1172             :              oom_adj != OOM_DISABLE) {
    1173             :                 err = -EINVAL;
    1174             :                 goto out;
    1175             :         }
    1176             : 
    1177             :         /*
    1178             :          * Scale /proc/pid/oom_score_adj appropriately ensuring that a maximum
    1179             :          * value is always attainable.
    1180             :          */
    1181           0 :         if (oom_adj == OOM_ADJUST_MAX)
    1182           0 :                 oom_adj = OOM_SCORE_ADJ_MAX;
    1183             :         else
    1184           0 :                 oom_adj = (oom_adj * OOM_SCORE_ADJ_MAX) / -OOM_DISABLE;
    1185             : 
    1186           0 :         err = __set_oom_adj(file, oom_adj, true);
    1187             : out:
    1188           0 :         return err < 0 ? err : count;
    1189             : }
    1190             : 
    1191             : static const struct file_operations proc_oom_adj_operations = {
    1192             :         .read           = oom_adj_read,
    1193             :         .write          = oom_adj_write,
    1194             :         .llseek         = generic_file_llseek,
    1195             : };
    1196             : 
    1197           0 : static ssize_t oom_score_adj_read(struct file *file, char __user *buf,
    1198             :                                         size_t count, loff_t *ppos)
    1199             : {
    1200           0 :         struct task_struct *task = get_proc_task(file_inode(file));
    1201             :         char buffer[PROC_NUMBUF];
    1202           0 :         short oom_score_adj = OOM_SCORE_ADJ_MIN;
    1203             :         size_t len;
    1204             : 
    1205           0 :         if (!task)
    1206             :                 return -ESRCH;
    1207           0 :         oom_score_adj = task->signal->oom_score_adj;
    1208           0 :         put_task_struct(task);
    1209           0 :         len = snprintf(buffer, sizeof(buffer), "%hd\n", oom_score_adj);
    1210           0 :         return simple_read_from_buffer(buf, count, ppos, buffer, len);
    1211             : }
    1212             : 
    1213           0 : static ssize_t oom_score_adj_write(struct file *file, const char __user *buf,
    1214             :                                         size_t count, loff_t *ppos)
    1215             : {
    1216             :         char buffer[PROC_NUMBUF];
    1217             :         int oom_score_adj;
    1218             :         int err;
    1219             : 
    1220           0 :         memset(buffer, 0, sizeof(buffer));
    1221           0 :         if (count > sizeof(buffer) - 1)
    1222           0 :                 count = sizeof(buffer) - 1;
    1223           0 :         if (copy_from_user(buffer, buf, count)) {
    1224             :                 err = -EFAULT;
    1225             :                 goto out;
    1226             :         }
    1227             : 
    1228           0 :         err = kstrtoint(strstrip(buffer), 0, &oom_score_adj);
    1229           0 :         if (err)
    1230             :                 goto out;
    1231           0 :         if (oom_score_adj < OOM_SCORE_ADJ_MIN ||
    1232             :                         oom_score_adj > OOM_SCORE_ADJ_MAX) {
    1233             :                 err = -EINVAL;
    1234             :                 goto out;
    1235             :         }
    1236             : 
    1237           0 :         err = __set_oom_adj(file, oom_score_adj, false);
    1238             : out:
    1239           0 :         return err < 0 ? err : count;
    1240             : }
    1241             : 
    1242             : static const struct file_operations proc_oom_score_adj_operations = {
    1243             :         .read           = oom_score_adj_read,
    1244             :         .write          = oom_score_adj_write,
    1245             :         .llseek         = default_llseek,
    1246             : };
    1247             : 
    1248             : #ifdef CONFIG_AUDIT
    1249             : #define TMPBUFLEN 11
    1250             : static ssize_t proc_loginuid_read(struct file * file, char __user * buf,
    1251             :                                   size_t count, loff_t *ppos)
    1252             : {
    1253             :         struct inode * inode = file_inode(file);
    1254             :         struct task_struct *task = get_proc_task(inode);
    1255             :         ssize_t length;
    1256             :         char tmpbuf[TMPBUFLEN];
    1257             : 
    1258             :         if (!task)
    1259             :                 return -ESRCH;
    1260             :         length = scnprintf(tmpbuf, TMPBUFLEN, "%u",
    1261             :                            from_kuid(file->f_cred->user_ns,
    1262             :                                      audit_get_loginuid(task)));
    1263             :         put_task_struct(task);
    1264             :         return simple_read_from_buffer(buf, count, ppos, tmpbuf, length);
    1265             : }
    1266             : 
    1267             : static ssize_t proc_loginuid_write(struct file * file, const char __user * buf,
    1268             :                                    size_t count, loff_t *ppos)
    1269             : {
    1270             :         struct inode * inode = file_inode(file);
    1271             :         uid_t loginuid;
    1272             :         kuid_t kloginuid;
    1273             :         int rv;
    1274             : 
    1275             :         /* Don't let kthreads write their own loginuid */
    1276             :         if (current->flags & PF_KTHREAD)
    1277             :                 return -EPERM;
    1278             : 
    1279             :         rcu_read_lock();
    1280             :         if (current != pid_task(proc_pid(inode), PIDTYPE_PID)) {
    1281             :                 rcu_read_unlock();
    1282             :                 return -EPERM;
    1283             :         }
    1284             :         rcu_read_unlock();
    1285             : 
    1286             :         if (*ppos != 0) {
    1287             :                 /* No partial writes. */
    1288             :                 return -EINVAL;
    1289             :         }
    1290             : 
    1291             :         rv = kstrtou32_from_user(buf, count, 10, &loginuid);
    1292             :         if (rv < 0)
    1293             :                 return rv;
    1294             : 
    1295             :         /* is userspace tring to explicitly UNSET the loginuid? */
    1296             :         if (loginuid == AUDIT_UID_UNSET) {
    1297             :                 kloginuid = INVALID_UID;
    1298             :         } else {
    1299             :                 kloginuid = make_kuid(file->f_cred->user_ns, loginuid);
    1300             :                 if (!uid_valid(kloginuid))
    1301             :                         return -EINVAL;
    1302             :         }
    1303             : 
    1304             :         rv = audit_set_loginuid(kloginuid);
    1305             :         if (rv < 0)
    1306             :                 return rv;
    1307             :         return count;
    1308             : }
    1309             : 
    1310             : static const struct file_operations proc_loginuid_operations = {
    1311             :         .read           = proc_loginuid_read,
    1312             :         .write          = proc_loginuid_write,
    1313             :         .llseek         = generic_file_llseek,
    1314             : };
    1315             : 
    1316             : static ssize_t proc_sessionid_read(struct file * file, char __user * buf,
    1317             :                                   size_t count, loff_t *ppos)
    1318             : {
    1319             :         struct inode * inode = file_inode(file);
    1320             :         struct task_struct *task = get_proc_task(inode);
    1321             :         ssize_t length;
    1322             :         char tmpbuf[TMPBUFLEN];
    1323             : 
    1324             :         if (!task)
    1325             :                 return -ESRCH;
    1326             :         length = scnprintf(tmpbuf, TMPBUFLEN, "%u",
    1327             :                                 audit_get_sessionid(task));
    1328             :         put_task_struct(task);
    1329             :         return simple_read_from_buffer(buf, count, ppos, tmpbuf, length);
    1330             : }
    1331             : 
    1332             : static const struct file_operations proc_sessionid_operations = {
    1333             :         .read           = proc_sessionid_read,
    1334             :         .llseek         = generic_file_llseek,
    1335             : };
    1336             : #endif
    1337             : 
    1338             : #ifdef CONFIG_FAULT_INJECTION
    1339             : static ssize_t proc_fault_inject_read(struct file * file, char __user * buf,
    1340             :                                       size_t count, loff_t *ppos)
    1341             : {
    1342             :         struct task_struct *task = get_proc_task(file_inode(file));
    1343             :         char buffer[PROC_NUMBUF];
    1344             :         size_t len;
    1345             :         int make_it_fail;
    1346             : 
    1347             :         if (!task)
    1348             :                 return -ESRCH;
    1349             :         make_it_fail = task->make_it_fail;
    1350             :         put_task_struct(task);
    1351             : 
    1352             :         len = snprintf(buffer, sizeof(buffer), "%i\n", make_it_fail);
    1353             : 
    1354             :         return simple_read_from_buffer(buf, count, ppos, buffer, len);
    1355             : }
    1356             : 
    1357             : static ssize_t proc_fault_inject_write(struct file * file,
    1358             :                         const char __user * buf, size_t count, loff_t *ppos)
    1359             : {
    1360             :         struct task_struct *task;
    1361             :         char buffer[PROC_NUMBUF];
    1362             :         int make_it_fail;
    1363             :         int rv;
    1364             : 
    1365             :         if (!capable(CAP_SYS_RESOURCE))
    1366             :                 return -EPERM;
    1367             :         memset(buffer, 0, sizeof(buffer));
    1368             :         if (count > sizeof(buffer) - 1)
    1369             :                 count = sizeof(buffer) - 1;
    1370             :         if (copy_from_user(buffer, buf, count))
    1371             :                 return -EFAULT;
    1372             :         rv = kstrtoint(strstrip(buffer), 0, &make_it_fail);
    1373             :         if (rv < 0)
    1374             :                 return rv;
    1375             :         if (make_it_fail < 0 || make_it_fail > 1)
    1376             :                 return -EINVAL;
    1377             : 
    1378             :         task = get_proc_task(file_inode(file));
    1379             :         if (!task)
    1380             :                 return -ESRCH;
    1381             :         task->make_it_fail = make_it_fail;
    1382             :         put_task_struct(task);
    1383             : 
    1384             :         return count;
    1385             : }
    1386             : 
    1387             : static const struct file_operations proc_fault_inject_operations = {
    1388             :         .read           = proc_fault_inject_read,
    1389             :         .write          = proc_fault_inject_write,
    1390             :         .llseek         = generic_file_llseek,
    1391             : };
    1392             : 
    1393             : static ssize_t proc_fail_nth_write(struct file *file, const char __user *buf,
    1394             :                                    size_t count, loff_t *ppos)
    1395             : {
    1396             :         struct task_struct *task;
    1397             :         int err;
    1398             :         unsigned int n;
    1399             : 
    1400             :         err = kstrtouint_from_user(buf, count, 0, &n);
    1401             :         if (err)
    1402             :                 return err;
    1403             : 
    1404             :         task = get_proc_task(file_inode(file));
    1405             :         if (!task)
    1406             :                 return -ESRCH;
    1407             :         task->fail_nth = n;
    1408             :         put_task_struct(task);
    1409             : 
    1410             :         return count;
    1411             : }
    1412             : 
    1413             : static ssize_t proc_fail_nth_read(struct file *file, char __user *buf,
    1414             :                                   size_t count, loff_t *ppos)
    1415             : {
    1416             :         struct task_struct *task;
    1417             :         char numbuf[PROC_NUMBUF];
    1418             :         ssize_t len;
    1419             : 
    1420             :         task = get_proc_task(file_inode(file));
    1421             :         if (!task)
    1422             :                 return -ESRCH;
    1423             :         len = snprintf(numbuf, sizeof(numbuf), "%u\n", task->fail_nth);
    1424             :         put_task_struct(task);
    1425             :         return simple_read_from_buffer(buf, count, ppos, numbuf, len);
    1426             : }
    1427             : 
    1428             : static const struct file_operations proc_fail_nth_operations = {
    1429             :         .read           = proc_fail_nth_read,
    1430             :         .write          = proc_fail_nth_write,
    1431             : };
    1432             : #endif
    1433             : 
    1434             : 
    1435             : #ifdef CONFIG_SCHED_DEBUG
    1436             : /*
    1437             :  * Print out various scheduling related per-task fields:
    1438             :  */
    1439           0 : static int sched_show(struct seq_file *m, void *v)
    1440             : {
    1441           0 :         struct inode *inode = m->private;
    1442           0 :         struct pid_namespace *ns = proc_pid_ns(inode->i_sb);
    1443             :         struct task_struct *p;
    1444             : 
    1445           0 :         p = get_proc_task(inode);
    1446           0 :         if (!p)
    1447             :                 return -ESRCH;
    1448           0 :         proc_sched_show_task(p, ns, m);
    1449             : 
    1450           0 :         put_task_struct(p);
    1451             : 
    1452           0 :         return 0;
    1453             : }
    1454             : 
    1455             : static ssize_t
    1456           0 : sched_write(struct file *file, const char __user *buf,
    1457             :             size_t count, loff_t *offset)
    1458             : {
    1459           0 :         struct inode *inode = file_inode(file);
    1460             :         struct task_struct *p;
    1461             : 
    1462           0 :         p = get_proc_task(inode);
    1463           0 :         if (!p)
    1464             :                 return -ESRCH;
    1465           0 :         proc_sched_set_task(p);
    1466             : 
    1467           0 :         put_task_struct(p);
    1468             : 
    1469           0 :         return count;
    1470             : }
    1471             : 
    1472           0 : static int sched_open(struct inode *inode, struct file *filp)
    1473             : {
    1474           0 :         return single_open(filp, sched_show, inode);
    1475             : }
    1476             : 
    1477             : static const struct file_operations proc_pid_sched_operations = {
    1478             :         .open           = sched_open,
    1479             :         .read           = seq_read,
    1480             :         .write          = sched_write,
    1481             :         .llseek         = seq_lseek,
    1482             :         .release        = single_release,
    1483             : };
    1484             : 
    1485             : #endif
    1486             : 
    1487             : #ifdef CONFIG_SCHED_AUTOGROUP
    1488             : /*
    1489             :  * Print out autogroup related information:
    1490             :  */
    1491             : static int sched_autogroup_show(struct seq_file *m, void *v)
    1492             : {
    1493             :         struct inode *inode = m->private;
    1494             :         struct task_struct *p;
    1495             : 
    1496             :         p = get_proc_task(inode);
    1497             :         if (!p)
    1498             :                 return -ESRCH;
    1499             :         proc_sched_autogroup_show_task(p, m);
    1500             : 
    1501             :         put_task_struct(p);
    1502             : 
    1503             :         return 0;
    1504             : }
    1505             : 
    1506             : static ssize_t
    1507             : sched_autogroup_write(struct file *file, const char __user *buf,
    1508             :             size_t count, loff_t *offset)
    1509             : {
    1510             :         struct inode *inode = file_inode(file);
    1511             :         struct task_struct *p;
    1512             :         char buffer[PROC_NUMBUF];
    1513             :         int nice;
    1514             :         int err;
    1515             : 
    1516             :         memset(buffer, 0, sizeof(buffer));
    1517             :         if (count > sizeof(buffer) - 1)
    1518             :                 count = sizeof(buffer) - 1;
    1519             :         if (copy_from_user(buffer, buf, count))
    1520             :                 return -EFAULT;
    1521             : 
    1522             :         err = kstrtoint(strstrip(buffer), 0, &nice);
    1523             :         if (err < 0)
    1524             :                 return err;
    1525             : 
    1526             :         p = get_proc_task(inode);
    1527             :         if (!p)
    1528             :                 return -ESRCH;
    1529             : 
    1530             :         err = proc_sched_autogroup_set_nice(p, nice);
    1531             :         if (err)
    1532             :                 count = err;
    1533             : 
    1534             :         put_task_struct(p);
    1535             : 
    1536             :         return count;
    1537             : }
    1538             : 
    1539             : static int sched_autogroup_open(struct inode *inode, struct file *filp)
    1540             : {
    1541             :         int ret;
    1542             : 
    1543             :         ret = single_open(filp, sched_autogroup_show, NULL);
    1544             :         if (!ret) {
    1545             :                 struct seq_file *m = filp->private_data;
    1546             : 
    1547             :                 m->private = inode;
    1548             :         }
    1549             :         return ret;
    1550             : }
    1551             : 
    1552             : static const struct file_operations proc_pid_sched_autogroup_operations = {
    1553             :         .open           = sched_autogroup_open,
    1554             :         .read           = seq_read,
    1555             :         .write          = sched_autogroup_write,
    1556             :         .llseek         = seq_lseek,
    1557             :         .release        = single_release,
    1558             : };
    1559             : 
    1560             : #endif /* CONFIG_SCHED_AUTOGROUP */
    1561             : 
    1562             : #ifdef CONFIG_TIME_NS
    1563             : static int timens_offsets_show(struct seq_file *m, void *v)
    1564             : {
    1565             :         struct task_struct *p;
    1566             : 
    1567             :         p = get_proc_task(file_inode(m->file));
    1568             :         if (!p)
    1569             :                 return -ESRCH;
    1570             :         proc_timens_show_offsets(p, m);
    1571             : 
    1572             :         put_task_struct(p);
    1573             : 
    1574             :         return 0;
    1575             : }
    1576             : 
    1577             : static ssize_t timens_offsets_write(struct file *file, const char __user *buf,
    1578             :                                     size_t count, loff_t *ppos)
    1579             : {
    1580             :         struct inode *inode = file_inode(file);
    1581             :         struct proc_timens_offset offsets[2];
    1582             :         char *kbuf = NULL, *pos, *next_line;
    1583             :         struct task_struct *p;
    1584             :         int ret, noffsets;
    1585             : 
    1586             :         /* Only allow < page size writes at the beginning of the file */
    1587             :         if ((*ppos != 0) || (count >= PAGE_SIZE))
    1588             :                 return -EINVAL;
    1589             : 
    1590             :         /* Slurp in the user data */
    1591             :         kbuf = memdup_user_nul(buf, count);
    1592             :         if (IS_ERR(kbuf))
    1593             :                 return PTR_ERR(kbuf);
    1594             : 
    1595             :         /* Parse the user data */
    1596             :         ret = -EINVAL;
    1597             :         noffsets = 0;
    1598             :         for (pos = kbuf; pos; pos = next_line) {
    1599             :                 struct proc_timens_offset *off = &offsets[noffsets];
    1600             :                 char clock[10];
    1601             :                 int err;
    1602             : 
    1603             :                 /* Find the end of line and ensure we don't look past it */
    1604             :                 next_line = strchr(pos, '\n');
    1605             :                 if (next_line) {
    1606             :                         *next_line = '\0';
    1607             :                         next_line++;
    1608             :                         if (*next_line == '\0')
    1609             :                                 next_line = NULL;
    1610             :                 }
    1611             : 
    1612             :                 err = sscanf(pos, "%9s %lld %lu", clock,
    1613             :                                 &off->val.tv_sec, &off->val.tv_nsec);
    1614             :                 if (err != 3 || off->val.tv_nsec >= NSEC_PER_SEC)
    1615             :                         goto out;
    1616             : 
    1617             :                 clock[sizeof(clock) - 1] = 0;
    1618             :                 if (strcmp(clock, "monotonic") == 0 ||
    1619             :                     strcmp(clock, __stringify(CLOCK_MONOTONIC)) == 0)
    1620             :                         off->clockid = CLOCK_MONOTONIC;
    1621             :                 else if (strcmp(clock, "boottime") == 0 ||
    1622             :                          strcmp(clock, __stringify(CLOCK_BOOTTIME)) == 0)
    1623             :                         off->clockid = CLOCK_BOOTTIME;
    1624             :                 else
    1625             :                         goto out;
    1626             : 
    1627             :                 noffsets++;
    1628             :                 if (noffsets == ARRAY_SIZE(offsets)) {
    1629             :                         if (next_line)
    1630             :                                 count = next_line - kbuf;
    1631             :                         break;
    1632             :                 }
    1633             :         }
    1634             : 
    1635             :         ret = -ESRCH;
    1636             :         p = get_proc_task(inode);
    1637             :         if (!p)
    1638             :                 goto out;
    1639             :         ret = proc_timens_set_offset(file, p, offsets, noffsets);
    1640             :         put_task_struct(p);
    1641             :         if (ret)
    1642             :                 goto out;
    1643             : 
    1644             :         ret = count;
    1645             : out:
    1646             :         kfree(kbuf);
    1647             :         return ret;
    1648             : }
    1649             : 
    1650             : static int timens_offsets_open(struct inode *inode, struct file *filp)
    1651             : {
    1652             :         return single_open(filp, timens_offsets_show, inode);
    1653             : }
    1654             : 
    1655             : static const struct file_operations proc_timens_offsets_operations = {
    1656             :         .open           = timens_offsets_open,
    1657             :         .read           = seq_read,
    1658             :         .write          = timens_offsets_write,
    1659             :         .llseek         = seq_lseek,
    1660             :         .release        = single_release,
    1661             : };
    1662             : #endif /* CONFIG_TIME_NS */
    1663             : 
    1664           0 : static ssize_t comm_write(struct file *file, const char __user *buf,
    1665             :                                 size_t count, loff_t *offset)
    1666             : {
    1667           0 :         struct inode *inode = file_inode(file);
    1668             :         struct task_struct *p;
    1669             :         char buffer[TASK_COMM_LEN];
    1670           0 :         const size_t maxlen = sizeof(buffer) - 1;
    1671             : 
    1672           0 :         memset(buffer, 0, sizeof(buffer));
    1673           0 :         if (copy_from_user(buffer, buf, count > maxlen ? maxlen : count))
    1674             :                 return -EFAULT;
    1675             : 
    1676           0 :         p = get_proc_task(inode);
    1677           0 :         if (!p)
    1678             :                 return -ESRCH;
    1679             : 
    1680           0 :         if (same_thread_group(current, p)) {
    1681             :                 set_task_comm(p, buffer);
    1682             :                 proc_comm_connector(p);
    1683             :         }
    1684             :         else
    1685             :                 count = -EINVAL;
    1686             : 
    1687           0 :         put_task_struct(p);
    1688             : 
    1689           0 :         return count;
    1690             : }
    1691             : 
    1692           0 : static int comm_show(struct seq_file *m, void *v)
    1693             : {
    1694           0 :         struct inode *inode = m->private;
    1695             :         struct task_struct *p;
    1696             : 
    1697           0 :         p = get_proc_task(inode);
    1698           0 :         if (!p)
    1699             :                 return -ESRCH;
    1700             : 
    1701           0 :         proc_task_name(m, p, false);
    1702           0 :         seq_putc(m, '\n');
    1703             : 
    1704           0 :         put_task_struct(p);
    1705             : 
    1706           0 :         return 0;
    1707             : }
    1708             : 
    1709           0 : static int comm_open(struct inode *inode, struct file *filp)
    1710             : {
    1711           0 :         return single_open(filp, comm_show, inode);
    1712             : }
    1713             : 
    1714             : static const struct file_operations proc_pid_set_comm_operations = {
    1715             :         .open           = comm_open,
    1716             :         .read           = seq_read,
    1717             :         .write          = comm_write,
    1718             :         .llseek         = seq_lseek,
    1719             :         .release        = single_release,
    1720             : };
    1721             : 
    1722           0 : static int proc_exe_link(struct dentry *dentry, struct path *exe_path)
    1723             : {
    1724             :         struct task_struct *task;
    1725             :         struct file *exe_file;
    1726             : 
    1727           0 :         task = get_proc_task(d_inode(dentry));
    1728           0 :         if (!task)
    1729             :                 return -ENOENT;
    1730           0 :         exe_file = get_task_exe_file(task);
    1731           0 :         put_task_struct(task);
    1732           0 :         if (exe_file) {
    1733           0 :                 *exe_path = exe_file->f_path;
    1734           0 :                 path_get(&exe_file->f_path);
    1735           0 :                 fput(exe_file);
    1736           0 :                 return 0;
    1737             :         } else
    1738             :                 return -ENOENT;
    1739             : }
    1740             : 
    1741           0 : static const char *proc_pid_get_link(struct dentry *dentry,
    1742             :                                      struct inode *inode,
    1743             :                                      struct delayed_call *done)
    1744             : {
    1745             :         struct path path;
    1746           0 :         int error = -EACCES;
    1747             : 
    1748           0 :         if (!dentry)
    1749             :                 return ERR_PTR(-ECHILD);
    1750             : 
    1751             :         /* Are we allowed to snoop on the tasks file descriptors? */
    1752           0 :         if (!proc_fd_access_allowed(inode))
    1753             :                 goto out;
    1754             : 
    1755           0 :         error = PROC_I(inode)->op.proc_get_link(dentry, &path);
    1756           0 :         if (error)
    1757             :                 goto out;
    1758             : 
    1759           0 :         error = nd_jump_link(&path);
    1760             : out:
    1761           0 :         return ERR_PTR(error);
    1762             : }
    1763             : 
    1764           0 : static int do_proc_readlink(const struct path *path, char __user *buffer, int buflen)
    1765             : {
    1766           0 :         char *tmp = kmalloc(PATH_MAX, GFP_KERNEL);
    1767             :         char *pathname;
    1768             :         int len;
    1769             : 
    1770           0 :         if (!tmp)
    1771             :                 return -ENOMEM;
    1772             : 
    1773           0 :         pathname = d_path(path, tmp, PATH_MAX);
    1774           0 :         len = PTR_ERR(pathname);
    1775           0 :         if (IS_ERR(pathname))
    1776             :                 goto out;
    1777           0 :         len = tmp + PATH_MAX - 1 - pathname;
    1778             : 
    1779           0 :         if (len > buflen)
    1780           0 :                 len = buflen;
    1781           0 :         if (copy_to_user(buffer, pathname, len))
    1782           0 :                 len = -EFAULT;
    1783             :  out:
    1784           0 :         kfree(tmp);
    1785           0 :         return len;
    1786             : }
    1787             : 
    1788           0 : static int proc_pid_readlink(struct dentry * dentry, char __user * buffer, int buflen)
    1789             : {
    1790           0 :         int error = -EACCES;
    1791           0 :         struct inode *inode = d_inode(dentry);
    1792             :         struct path path;
    1793             : 
    1794             :         /* Are we allowed to snoop on the tasks file descriptors? */
    1795           0 :         if (!proc_fd_access_allowed(inode))
    1796             :                 goto out;
    1797             : 
    1798           0 :         error = PROC_I(inode)->op.proc_get_link(dentry, &path);
    1799           0 :         if (error)
    1800             :                 goto out;
    1801             : 
    1802           0 :         error = do_proc_readlink(&path, buffer, buflen);
    1803           0 :         path_put(&path);
    1804             : out:
    1805           0 :         return error;
    1806             : }
    1807             : 
    1808             : const struct inode_operations proc_pid_link_inode_operations = {
    1809             :         .readlink       = proc_pid_readlink,
    1810             :         .get_link       = proc_pid_get_link,
    1811             :         .setattr        = proc_setattr,
    1812             : };
    1813             : 
    1814             : 
    1815             : /* building an inode */
    1816             : 
    1817           0 : void task_dump_owner(struct task_struct *task, umode_t mode,
    1818             :                      kuid_t *ruid, kgid_t *rgid)
    1819             : {
    1820             :         /* Depending on the state of dumpable compute who should own a
    1821             :          * proc file for a task.
    1822             :          */
    1823             :         const struct cred *cred;
    1824             :         kuid_t uid;
    1825             :         kgid_t gid;
    1826             : 
    1827           0 :         if (unlikely(task->flags & PF_KTHREAD)) {
    1828           0 :                 *ruid = GLOBAL_ROOT_UID;
    1829           0 :                 *rgid = GLOBAL_ROOT_GID;
    1830           0 :                 return;
    1831             :         }
    1832             : 
    1833             :         /* Default to the tasks effective ownership */
    1834             :         rcu_read_lock();
    1835           0 :         cred = __task_cred(task);
    1836           0 :         uid = cred->euid;
    1837           0 :         gid = cred->egid;
    1838             :         rcu_read_unlock();
    1839             : 
    1840             :         /*
    1841             :          * Before the /proc/pid/status file was created the only way to read
    1842             :          * the effective uid of a /process was to stat /proc/pid.  Reading
    1843             :          * /proc/pid/status is slow enough that procps and other packages
    1844             :          * kept stating /proc/pid.  To keep the rules in /proc simple I have
    1845             :          * made this apply to all per process world readable and executable
    1846             :          * directories.
    1847             :          */
    1848           0 :         if (mode != (S_IFDIR|S_IRUGO|S_IXUGO)) {
    1849             :                 struct mm_struct *mm;
    1850           0 :                 task_lock(task);
    1851           0 :                 mm = task->mm;
    1852             :                 /* Make non-dumpable tasks owned by some root */
    1853           0 :                 if (mm) {
    1854           0 :                         if (get_dumpable(mm) != SUID_DUMP_USER) {
    1855           0 :                                 struct user_namespace *user_ns = mm->user_ns;
    1856             : 
    1857           0 :                                 uid = make_kuid(user_ns, 0);
    1858           0 :                                 if (!uid_valid(uid))
    1859             :                                         uid = GLOBAL_ROOT_UID;
    1860             : 
    1861           0 :                                 gid = make_kgid(user_ns, 0);
    1862           0 :                                 if (!gid_valid(gid))
    1863             :                                         gid = GLOBAL_ROOT_GID;
    1864             :                         }
    1865             :                 } else {
    1866             :                         uid = GLOBAL_ROOT_UID;
    1867             :                         gid = GLOBAL_ROOT_GID;
    1868             :                 }
    1869           0 :                 task_unlock(task);
    1870             :         }
    1871           0 :         *ruid = uid;
    1872           0 :         *rgid = gid;
    1873             : }
    1874             : 
    1875           0 : void proc_pid_evict_inode(struct proc_inode *ei)
    1876             : {
    1877           0 :         struct pid *pid = ei->pid;
    1878             : 
    1879           0 :         if (S_ISDIR(ei->vfs_inode.i_mode)) {
    1880           0 :                 spin_lock(&pid->lock);
    1881           0 :                 hlist_del_init_rcu(&ei->sibling_inodes);
    1882           0 :                 spin_unlock(&pid->lock);
    1883             :         }
    1884             : 
    1885           0 :         put_pid(pid);
    1886           0 : }
    1887             : 
    1888           0 : struct inode *proc_pid_make_inode(struct super_block *sb,
    1889             :                                   struct task_struct *task, umode_t mode)
    1890             : {
    1891             :         struct inode * inode;
    1892             :         struct proc_inode *ei;
    1893             :         struct pid *pid;
    1894             : 
    1895             :         /* We need a new inode */
    1896             : 
    1897           0 :         inode = new_inode(sb);
    1898           0 :         if (!inode)
    1899             :                 goto out;
    1900             : 
    1901             :         /* Common stuff */
    1902           0 :         ei = PROC_I(inode);
    1903           0 :         inode->i_mode = mode;
    1904           0 :         inode->i_ino = get_next_ino();
    1905           0 :         inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
    1906           0 :         inode->i_op = &proc_def_inode_operations;
    1907             : 
    1908             :         /*
    1909             :          * grab the reference to task.
    1910             :          */
    1911           0 :         pid = get_task_pid(task, PIDTYPE_PID);
    1912           0 :         if (!pid)
    1913             :                 goto out_unlock;
    1914             : 
    1915             :         /* Let the pid remember us for quick removal */
    1916           0 :         ei->pid = pid;
    1917             : 
    1918           0 :         task_dump_owner(task, 0, &inode->i_uid, &inode->i_gid);
    1919             :         security_task_to_inode(task, inode);
    1920             : 
    1921             : out:
    1922             :         return inode;
    1923             : 
    1924             : out_unlock:
    1925           0 :         iput(inode);
    1926           0 :         return NULL;
    1927             : }
    1928             : 
    1929             : /*
    1930             :  * Generating an inode and adding it into @pid->inodes, so that task will
    1931             :  * invalidate inode's dentry before being released.
    1932             :  *
    1933             :  * This helper is used for creating dir-type entries under '/proc' and
    1934             :  * '/proc/<tgid>/task'. Other entries(eg. fd, stat) under '/proc/<tgid>'
    1935             :  * can be released by invalidating '/proc/<tgid>' dentry.
    1936             :  * In theory, dentries under '/proc/<tgid>/task' can also be released by
    1937             :  * invalidating '/proc/<tgid>' dentry, we reserve it to handle single
    1938             :  * thread exiting situation: Any one of threads should invalidate its
    1939             :  * '/proc/<tgid>/task/<pid>' dentry before released.
    1940             :  */
    1941           0 : static struct inode *proc_pid_make_base_inode(struct super_block *sb,
    1942             :                                 struct task_struct *task, umode_t mode)
    1943             : {
    1944             :         struct inode *inode;
    1945             :         struct proc_inode *ei;
    1946             :         struct pid *pid;
    1947             : 
    1948           0 :         inode = proc_pid_make_inode(sb, task, mode);
    1949           0 :         if (!inode)
    1950             :                 return NULL;
    1951             : 
    1952             :         /* Let proc_flush_pid find this directory inode */
    1953           0 :         ei = PROC_I(inode);
    1954           0 :         pid = ei->pid;
    1955           0 :         spin_lock(&pid->lock);
    1956           0 :         hlist_add_head_rcu(&ei->sibling_inodes, &pid->inodes);
    1957           0 :         spin_unlock(&pid->lock);
    1958             : 
    1959           0 :         return inode;
    1960             : }
    1961             : 
    1962           0 : int pid_getattr(struct mnt_idmap *idmap, const struct path *path,
    1963             :                 struct kstat *stat, u32 request_mask, unsigned int query_flags)
    1964             : {
    1965           0 :         struct inode *inode = d_inode(path->dentry);
    1966           0 :         struct proc_fs_info *fs_info = proc_sb_info(inode->i_sb);
    1967             :         struct task_struct *task;
    1968             : 
    1969           0 :         generic_fillattr(&nop_mnt_idmap, inode, stat);
    1970             : 
    1971           0 :         stat->uid = GLOBAL_ROOT_UID;
    1972           0 :         stat->gid = GLOBAL_ROOT_GID;
    1973             :         rcu_read_lock();
    1974           0 :         task = pid_task(proc_pid(inode), PIDTYPE_PID);
    1975           0 :         if (task) {
    1976           0 :                 if (!has_pid_permissions(fs_info, task, HIDEPID_INVISIBLE)) {
    1977             :                         rcu_read_unlock();
    1978             :                         /*
    1979             :                          * This doesn't prevent learning whether PID exists,
    1980             :                          * it only makes getattr() consistent with readdir().
    1981             :                          */
    1982           0 :                         return -ENOENT;
    1983             :                 }
    1984           0 :                 task_dump_owner(task, inode->i_mode, &stat->uid, &stat->gid);
    1985             :         }
    1986             :         rcu_read_unlock();
    1987           0 :         return 0;
    1988             : }
    1989             : 
    1990             : /* dentry stuff */
    1991             : 
    1992             : /*
    1993             :  * Set <pid>/... inode ownership (can change due to setuid(), etc.)
    1994             :  */
    1995           0 : void pid_update_inode(struct task_struct *task, struct inode *inode)
    1996             : {
    1997           0 :         task_dump_owner(task, inode->i_mode, &inode->i_uid, &inode->i_gid);
    1998             : 
    1999           0 :         inode->i_mode &= ~(S_ISUID | S_ISGID);
    2000           0 :         security_task_to_inode(task, inode);
    2001           0 : }
    2002             : 
    2003             : /*
    2004             :  * Rewrite the inode's ownerships here because the owning task may have
    2005             :  * performed a setuid(), etc.
    2006             :  *
    2007             :  */
    2008           0 : static int pid_revalidate(struct dentry *dentry, unsigned int flags)
    2009             : {
    2010             :         struct inode *inode;
    2011             :         struct task_struct *task;
    2012           0 :         int ret = 0;
    2013             : 
    2014             :         rcu_read_lock();
    2015           0 :         inode = d_inode_rcu(dentry);
    2016           0 :         if (!inode)
    2017             :                 goto out;
    2018           0 :         task = pid_task(proc_pid(inode), PIDTYPE_PID);
    2019             : 
    2020           0 :         if (task) {
    2021           0 :                 pid_update_inode(task, inode);
    2022           0 :                 ret = 1;
    2023             :         }
    2024             : out:
    2025             :         rcu_read_unlock();
    2026           0 :         return ret;
    2027             : }
    2028             : 
    2029             : static inline bool proc_inode_is_dead(struct inode *inode)
    2030             : {
    2031           0 :         return !proc_pid(inode)->tasks[PIDTYPE_PID].first;
    2032             : }
    2033             : 
    2034           0 : int pid_delete_dentry(const struct dentry *dentry)
    2035             : {
    2036             :         /* Is the task we represent dead?
    2037             :          * If so, then don't put the dentry on the lru list,
    2038             :          * kill it immediately.
    2039             :          */
    2040           0 :         return proc_inode_is_dead(d_inode(dentry));
    2041             : }
    2042             : 
    2043             : const struct dentry_operations pid_dentry_operations =
    2044             : {
    2045             :         .d_revalidate   = pid_revalidate,
    2046             :         .d_delete       = pid_delete_dentry,
    2047             : };
    2048             : 
    2049             : /* Lookups */
    2050             : 
    2051             : /*
    2052             :  * Fill a directory entry.
    2053             :  *
    2054             :  * If possible create the dcache entry and derive our inode number and
    2055             :  * file type from dcache entry.
    2056             :  *
    2057             :  * Since all of the proc inode numbers are dynamically generated, the inode
    2058             :  * numbers do not exist until the inode is cache.  This means creating
    2059             :  * the dcache entry in readdir is necessary to keep the inode numbers
    2060             :  * reported by readdir in sync with the inode numbers reported
    2061             :  * by stat.
    2062             :  */
    2063           0 : bool proc_fill_cache(struct file *file, struct dir_context *ctx,
    2064             :         const char *name, unsigned int len,
    2065             :         instantiate_t instantiate, struct task_struct *task, const void *ptr)
    2066             : {
    2067           0 :         struct dentry *child, *dir = file->f_path.dentry;
    2068           0 :         struct qstr qname = QSTR_INIT(name, len);
    2069             :         struct inode *inode;
    2070           0 :         unsigned type = DT_UNKNOWN;
    2071           0 :         ino_t ino = 1;
    2072             : 
    2073           0 :         child = d_hash_and_lookup(dir, &qname);
    2074           0 :         if (!child) {
    2075           0 :                 DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
    2076           0 :                 child = d_alloc_parallel(dir, &qname, &wq);
    2077           0 :                 if (IS_ERR(child))
    2078             :                         goto end_instantiate;
    2079           0 :                 if (d_in_lookup(child)) {
    2080             :                         struct dentry *res;
    2081           0 :                         res = instantiate(child, task, ptr);
    2082           0 :                         d_lookup_done(child);
    2083           0 :                         if (unlikely(res)) {
    2084           0 :                                 dput(child);
    2085           0 :                                 child = res;
    2086           0 :                                 if (IS_ERR(child))
    2087             :                                         goto end_instantiate;
    2088             :                         }
    2089             :                 }
    2090             :         }
    2091           0 :         inode = d_inode(child);
    2092           0 :         ino = inode->i_ino;
    2093           0 :         type = inode->i_mode >> 12;
    2094           0 :         dput(child);
    2095             : end_instantiate:
    2096           0 :         return dir_emit(ctx, name, len, ino, type);
    2097             : }
    2098             : 
    2099             : /*
    2100             :  * dname_to_vma_addr - maps a dentry name into two unsigned longs
    2101             :  * which represent vma start and end addresses.
    2102             :  */
    2103           0 : static int dname_to_vma_addr(struct dentry *dentry,
    2104             :                              unsigned long *start, unsigned long *end)
    2105             : {
    2106           0 :         const char *str = dentry->d_name.name;
    2107             :         unsigned long long sval, eval;
    2108             :         unsigned int len;
    2109             : 
    2110           0 :         if (str[0] == '0' && str[1] != '-')
    2111             :                 return -EINVAL;
    2112           0 :         len = _parse_integer(str, 16, &sval);
    2113           0 :         if (len & KSTRTOX_OVERFLOW)
    2114             :                 return -EINVAL;
    2115             :         if (sval != (unsigned long)sval)
    2116             :                 return -EINVAL;
    2117           0 :         str += len;
    2118             : 
    2119           0 :         if (*str != '-')
    2120             :                 return -EINVAL;
    2121           0 :         str++;
    2122             : 
    2123           0 :         if (str[0] == '0' && str[1])
    2124             :                 return -EINVAL;
    2125           0 :         len = _parse_integer(str, 16, &eval);
    2126           0 :         if (len & KSTRTOX_OVERFLOW)
    2127             :                 return -EINVAL;
    2128             :         if (eval != (unsigned long)eval)
    2129             :                 return -EINVAL;
    2130           0 :         str += len;
    2131             : 
    2132           0 :         if (*str != '\0')
    2133             :                 return -EINVAL;
    2134             : 
    2135           0 :         *start = sval;
    2136           0 :         *end = eval;
    2137             : 
    2138             :         return 0;
    2139             : }
    2140             : 
    2141           0 : static int map_files_d_revalidate(struct dentry *dentry, unsigned int flags)
    2142             : {
    2143             :         unsigned long vm_start, vm_end;
    2144           0 :         bool exact_vma_exists = false;
    2145           0 :         struct mm_struct *mm = NULL;
    2146             :         struct task_struct *task;
    2147             :         struct inode *inode;
    2148           0 :         int status = 0;
    2149             : 
    2150           0 :         if (flags & LOOKUP_RCU)
    2151             :                 return -ECHILD;
    2152             : 
    2153           0 :         inode = d_inode(dentry);
    2154           0 :         task = get_proc_task(inode);
    2155           0 :         if (!task)
    2156             :                 goto out_notask;
    2157             : 
    2158           0 :         mm = mm_access(task, PTRACE_MODE_READ_FSCREDS);
    2159           0 :         if (IS_ERR_OR_NULL(mm))
    2160             :                 goto out;
    2161             : 
    2162           0 :         if (!dname_to_vma_addr(dentry, &vm_start, &vm_end)) {
    2163           0 :                 status = mmap_read_lock_killable(mm);
    2164           0 :                 if (!status) {
    2165           0 :                         exact_vma_exists = !!find_exact_vma(mm, vm_start,
    2166             :                                                             vm_end);
    2167             :                         mmap_read_unlock(mm);
    2168             :                 }
    2169             :         }
    2170             : 
    2171           0 :         mmput(mm);
    2172             : 
    2173           0 :         if (exact_vma_exists) {
    2174           0 :                 task_dump_owner(task, 0, &inode->i_uid, &inode->i_gid);
    2175             : 
    2176             :                 security_task_to_inode(task, inode);
    2177             :                 status = 1;
    2178             :         }
    2179             : 
    2180             : out:
    2181           0 :         put_task_struct(task);
    2182             : 
    2183             : out_notask:
    2184             :         return status;
    2185             : }
    2186             : 
    2187             : static const struct dentry_operations tid_map_files_dentry_operations = {
    2188             :         .d_revalidate   = map_files_d_revalidate,
    2189             :         .d_delete       = pid_delete_dentry,
    2190             : };
    2191             : 
    2192           0 : static int map_files_get_link(struct dentry *dentry, struct path *path)
    2193             : {
    2194             :         unsigned long vm_start, vm_end;
    2195             :         struct vm_area_struct *vma;
    2196             :         struct task_struct *task;
    2197             :         struct mm_struct *mm;
    2198             :         int rc;
    2199             : 
    2200           0 :         rc = -ENOENT;
    2201           0 :         task = get_proc_task(d_inode(dentry));
    2202           0 :         if (!task)
    2203             :                 goto out;
    2204             : 
    2205           0 :         mm = get_task_mm(task);
    2206           0 :         put_task_struct(task);
    2207           0 :         if (!mm)
    2208             :                 goto out;
    2209             : 
    2210           0 :         rc = dname_to_vma_addr(dentry, &vm_start, &vm_end);
    2211           0 :         if (rc)
    2212             :                 goto out_mmput;
    2213             : 
    2214           0 :         rc = mmap_read_lock_killable(mm);
    2215           0 :         if (rc)
    2216             :                 goto out_mmput;
    2217             : 
    2218           0 :         rc = -ENOENT;
    2219           0 :         vma = find_exact_vma(mm, vm_start, vm_end);
    2220           0 :         if (vma && vma->vm_file) {
    2221           0 :                 *path = vma->vm_file->f_path;
    2222           0 :                 path_get(path);
    2223           0 :                 rc = 0;
    2224             :         }
    2225             :         mmap_read_unlock(mm);
    2226             : 
    2227             : out_mmput:
    2228           0 :         mmput(mm);
    2229             : out:
    2230           0 :         return rc;
    2231             : }
    2232             : 
    2233             : struct map_files_info {
    2234             :         unsigned long   start;
    2235             :         unsigned long   end;
    2236             :         fmode_t         mode;
    2237             : };
    2238             : 
    2239             : /*
    2240             :  * Only allow CAP_SYS_ADMIN and CAP_CHECKPOINT_RESTORE to follow the links, due
    2241             :  * to concerns about how the symlinks may be used to bypass permissions on
    2242             :  * ancestor directories in the path to the file in question.
    2243             :  */
    2244             : static const char *
    2245           0 : proc_map_files_get_link(struct dentry *dentry,
    2246             :                         struct inode *inode,
    2247             :                         struct delayed_call *done)
    2248             : {
    2249           0 :         if (!checkpoint_restore_ns_capable(&init_user_ns))
    2250             :                 return ERR_PTR(-EPERM);
    2251             : 
    2252           0 :         return proc_pid_get_link(dentry, inode, done);
    2253             : }
    2254             : 
    2255             : /*
    2256             :  * Identical to proc_pid_link_inode_operations except for get_link()
    2257             :  */
    2258             : static const struct inode_operations proc_map_files_link_inode_operations = {
    2259             :         .readlink       = proc_pid_readlink,
    2260             :         .get_link       = proc_map_files_get_link,
    2261             :         .setattr        = proc_setattr,
    2262             : };
    2263             : 
    2264             : static struct dentry *
    2265           0 : proc_map_files_instantiate(struct dentry *dentry,
    2266             :                            struct task_struct *task, const void *ptr)
    2267             : {
    2268           0 :         fmode_t mode = (fmode_t)(unsigned long)ptr;
    2269             :         struct proc_inode *ei;
    2270             :         struct inode *inode;
    2271             : 
    2272           0 :         inode = proc_pid_make_inode(dentry->d_sb, task, S_IFLNK |
    2273           0 :                                     ((mode & FMODE_READ ) ? S_IRUSR : 0) |
    2274           0 :                                     ((mode & FMODE_WRITE) ? S_IWUSR : 0));
    2275           0 :         if (!inode)
    2276             :                 return ERR_PTR(-ENOENT);
    2277             : 
    2278           0 :         ei = PROC_I(inode);
    2279           0 :         ei->op.proc_get_link = map_files_get_link;
    2280             : 
    2281           0 :         inode->i_op = &proc_map_files_link_inode_operations;
    2282           0 :         inode->i_size = 64;
    2283             : 
    2284           0 :         d_set_d_op(dentry, &tid_map_files_dentry_operations);
    2285           0 :         return d_splice_alias(inode, dentry);
    2286             : }
    2287             : 
    2288           0 : static struct dentry *proc_map_files_lookup(struct inode *dir,
    2289             :                 struct dentry *dentry, unsigned int flags)
    2290             : {
    2291             :         unsigned long vm_start, vm_end;
    2292             :         struct vm_area_struct *vma;
    2293             :         struct task_struct *task;
    2294             :         struct dentry *result;
    2295             :         struct mm_struct *mm;
    2296             : 
    2297           0 :         result = ERR_PTR(-ENOENT);
    2298           0 :         task = get_proc_task(dir);
    2299           0 :         if (!task)
    2300             :                 goto out;
    2301             : 
    2302           0 :         result = ERR_PTR(-EACCES);
    2303           0 :         if (!ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS))
    2304             :                 goto out_put_task;
    2305             : 
    2306           0 :         result = ERR_PTR(-ENOENT);
    2307           0 :         if (dname_to_vma_addr(dentry, &vm_start, &vm_end))
    2308             :                 goto out_put_task;
    2309             : 
    2310           0 :         mm = get_task_mm(task);
    2311           0 :         if (!mm)
    2312             :                 goto out_put_task;
    2313             : 
    2314           0 :         result = ERR_PTR(-EINTR);
    2315           0 :         if (mmap_read_lock_killable(mm))
    2316             :                 goto out_put_mm;
    2317             : 
    2318           0 :         result = ERR_PTR(-ENOENT);
    2319           0 :         vma = find_exact_vma(mm, vm_start, vm_end);
    2320           0 :         if (!vma)
    2321             :                 goto out_no_vma;
    2322             : 
    2323           0 :         if (vma->vm_file)
    2324           0 :                 result = proc_map_files_instantiate(dentry, task,
    2325           0 :                                 (void *)(unsigned long)vma->vm_file->f_mode);
    2326             : 
    2327             : out_no_vma:
    2328             :         mmap_read_unlock(mm);
    2329             : out_put_mm:
    2330           0 :         mmput(mm);
    2331             : out_put_task:
    2332           0 :         put_task_struct(task);
    2333             : out:
    2334           0 :         return result;
    2335             : }
    2336             : 
    2337             : static const struct inode_operations proc_map_files_inode_operations = {
    2338             :         .lookup         = proc_map_files_lookup,
    2339             :         .permission     = proc_fd_permission,
    2340             :         .setattr        = proc_setattr,
    2341             : };
    2342             : 
    2343             : static int
    2344           0 : proc_map_files_readdir(struct file *file, struct dir_context *ctx)
    2345             : {
    2346             :         struct vm_area_struct *vma;
    2347             :         struct task_struct *task;
    2348             :         struct mm_struct *mm;
    2349             :         unsigned long nr_files, pos, i;
    2350             :         GENRADIX(struct map_files_info) fa;
    2351             :         struct map_files_info *p;
    2352             :         int ret;
    2353             :         struct vma_iterator vmi;
    2354             : 
    2355           0 :         genradix_init(&fa);
    2356             : 
    2357           0 :         ret = -ENOENT;
    2358           0 :         task = get_proc_task(file_inode(file));
    2359           0 :         if (!task)
    2360             :                 goto out;
    2361             : 
    2362           0 :         ret = -EACCES;
    2363           0 :         if (!ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS))
    2364             :                 goto out_put_task;
    2365             : 
    2366           0 :         ret = 0;
    2367           0 :         if (!dir_emit_dots(file, ctx))
    2368             :                 goto out_put_task;
    2369             : 
    2370           0 :         mm = get_task_mm(task);
    2371           0 :         if (!mm)
    2372             :                 goto out_put_task;
    2373             : 
    2374           0 :         ret = mmap_read_lock_killable(mm);
    2375           0 :         if (ret) {
    2376           0 :                 mmput(mm);
    2377           0 :                 goto out_put_task;
    2378             :         }
    2379             : 
    2380           0 :         nr_files = 0;
    2381             : 
    2382             :         /*
    2383             :          * We need two passes here:
    2384             :          *
    2385             :          *  1) Collect vmas of mapped files with mmap_lock taken
    2386             :          *  2) Release mmap_lock and instantiate entries
    2387             :          *
    2388             :          * otherwise we get lockdep complained, since filldir()
    2389             :          * routine might require mmap_lock taken in might_fault().
    2390             :          */
    2391             : 
    2392           0 :         pos = 2;
    2393             :         vma_iter_init(&vmi, mm, 0);
    2394           0 :         for_each_vma(vmi, vma) {
    2395           0 :                 if (!vma->vm_file)
    2396           0 :                         continue;
    2397           0 :                 if (++pos <= ctx->pos)
    2398           0 :                         continue;
    2399             : 
    2400           0 :                 p = genradix_ptr_alloc(&fa, nr_files++, GFP_KERNEL);
    2401           0 :                 if (!p) {
    2402           0 :                         ret = -ENOMEM;
    2403           0 :                         mmap_read_unlock(mm);
    2404           0 :                         mmput(mm);
    2405           0 :                         goto out_put_task;
    2406             :                 }
    2407             : 
    2408           0 :                 p->start = vma->vm_start;
    2409           0 :                 p->end = vma->vm_end;
    2410           0 :                 p->mode = vma->vm_file->f_mode;
    2411             :         }
    2412           0 :         mmap_read_unlock(mm);
    2413           0 :         mmput(mm);
    2414             : 
    2415           0 :         for (i = 0; i < nr_files; i++) {
    2416             :                 char buf[4 * sizeof(long) + 2]; /* max: %lx-%lx\0 */
    2417             :                 unsigned int len;
    2418             : 
    2419           0 :                 p = genradix_ptr(&fa, i);
    2420           0 :                 len = snprintf(buf, sizeof(buf), "%lx-%lx", p->start, p->end);
    2421           0 :                 if (!proc_fill_cache(file, ctx,
    2422             :                                       buf, len,
    2423             :                                       proc_map_files_instantiate,
    2424             :                                       task,
    2425           0 :                                       (void *)(unsigned long)p->mode))
    2426             :                         break;
    2427           0 :                 ctx->pos++;
    2428             :         }
    2429             : 
    2430             : out_put_task:
    2431           0 :         put_task_struct(task);
    2432             : out:
    2433           0 :         genradix_free(&fa);
    2434           0 :         return ret;
    2435             : }
    2436             : 
    2437             : static const struct file_operations proc_map_files_operations = {
    2438             :         .read           = generic_read_dir,
    2439             :         .iterate_shared = proc_map_files_readdir,
    2440             :         .llseek         = generic_file_llseek,
    2441             : };
    2442             : 
    2443             : #if defined(CONFIG_CHECKPOINT_RESTORE) && defined(CONFIG_POSIX_TIMERS)
    2444             : struct timers_private {
    2445             :         struct pid *pid;
    2446             :         struct task_struct *task;
    2447             :         struct sighand_struct *sighand;
    2448             :         struct pid_namespace *ns;
    2449             :         unsigned long flags;
    2450             : };
    2451             : 
    2452             : static void *timers_start(struct seq_file *m, loff_t *pos)
    2453             : {
    2454             :         struct timers_private *tp = m->private;
    2455             : 
    2456             :         tp->task = get_pid_task(tp->pid, PIDTYPE_PID);
    2457             :         if (!tp->task)
    2458             :                 return ERR_PTR(-ESRCH);
    2459             : 
    2460             :         tp->sighand = lock_task_sighand(tp->task, &tp->flags);
    2461             :         if (!tp->sighand)
    2462             :                 return ERR_PTR(-ESRCH);
    2463             : 
    2464             :         return seq_list_start(&tp->task->signal->posix_timers, *pos);
    2465             : }
    2466             : 
    2467             : static void *timers_next(struct seq_file *m, void *v, loff_t *pos)
    2468             : {
    2469             :         struct timers_private *tp = m->private;
    2470             :         return seq_list_next(v, &tp->task->signal->posix_timers, pos);
    2471             : }
    2472             : 
    2473             : static void timers_stop(struct seq_file *m, void *v)
    2474             : {
    2475             :         struct timers_private *tp = m->private;
    2476             : 
    2477             :         if (tp->sighand) {
    2478             :                 unlock_task_sighand(tp->task, &tp->flags);
    2479             :                 tp->sighand = NULL;
    2480             :         }
    2481             : 
    2482             :         if (tp->task) {
    2483             :                 put_task_struct(tp->task);
    2484             :                 tp->task = NULL;
    2485             :         }
    2486             : }
    2487             : 
    2488             : static int show_timer(struct seq_file *m, void *v)
    2489             : {
    2490             :         struct k_itimer *timer;
    2491             :         struct timers_private *tp = m->private;
    2492             :         int notify;
    2493             :         static const char * const nstr[] = {
    2494             :                 [SIGEV_SIGNAL] = "signal",
    2495             :                 [SIGEV_NONE] = "none",
    2496             :                 [SIGEV_THREAD] = "thread",
    2497             :         };
    2498             : 
    2499             :         timer = list_entry((struct list_head *)v, struct k_itimer, list);
    2500             :         notify = timer->it_sigev_notify;
    2501             : 
    2502             :         seq_printf(m, "ID: %d\n", timer->it_id);
    2503             :         seq_printf(m, "signal: %d/%px\n",
    2504             :                    timer->sigq->info.si_signo,
    2505             :                    timer->sigq->info.si_value.sival_ptr);
    2506             :         seq_printf(m, "notify: %s/%s.%d\n",
    2507             :                    nstr[notify & ~SIGEV_THREAD_ID],
    2508             :                    (notify & SIGEV_THREAD_ID) ? "tid" : "pid",
    2509             :                    pid_nr_ns(timer->it_pid, tp->ns));
    2510             :         seq_printf(m, "ClockID: %d\n", timer->it_clock);
    2511             : 
    2512             :         return 0;
    2513             : }
    2514             : 
    2515             : static const struct seq_operations proc_timers_seq_ops = {
    2516             :         .start  = timers_start,
    2517             :         .next   = timers_next,
    2518             :         .stop   = timers_stop,
    2519             :         .show   = show_timer,
    2520             : };
    2521             : 
    2522             : static int proc_timers_open(struct inode *inode, struct file *file)
    2523             : {
    2524             :         struct timers_private *tp;
    2525             : 
    2526             :         tp = __seq_open_private(file, &proc_timers_seq_ops,
    2527             :                         sizeof(struct timers_private));
    2528             :         if (!tp)
    2529             :                 return -ENOMEM;
    2530             : 
    2531             :         tp->pid = proc_pid(inode);
    2532             :         tp->ns = proc_pid_ns(inode->i_sb);
    2533             :         return 0;
    2534             : }
    2535             : 
    2536             : static const struct file_operations proc_timers_operations = {
    2537             :         .open           = proc_timers_open,
    2538             :         .read           = seq_read,
    2539             :         .llseek         = seq_lseek,
    2540             :         .release        = seq_release_private,
    2541             : };
    2542             : #endif
    2543             : 
    2544           0 : static ssize_t timerslack_ns_write(struct file *file, const char __user *buf,
    2545             :                                         size_t count, loff_t *offset)
    2546             : {
    2547           0 :         struct inode *inode = file_inode(file);
    2548             :         struct task_struct *p;
    2549             :         u64 slack_ns;
    2550             :         int err;
    2551             : 
    2552           0 :         err = kstrtoull_from_user(buf, count, 10, &slack_ns);
    2553           0 :         if (err < 0)
    2554           0 :                 return err;
    2555             : 
    2556           0 :         p = get_proc_task(inode);
    2557           0 :         if (!p)
    2558             :                 return -ESRCH;
    2559             : 
    2560           0 :         if (p != current) {
    2561             :                 rcu_read_lock();
    2562           0 :                 if (!ns_capable(__task_cred(p)->user_ns, CAP_SYS_NICE)) {
    2563             :                         rcu_read_unlock();
    2564           0 :                         count = -EPERM;
    2565           0 :                         goto out;
    2566             :                 }
    2567           0 :                 rcu_read_unlock();
    2568             : 
    2569           0 :                 err = security_task_setscheduler(p);
    2570           0 :                 if (err) {
    2571           0 :                         count = err;
    2572           0 :                         goto out;
    2573             :                 }
    2574             :         }
    2575             : 
    2576             :         task_lock(p);
    2577           0 :         if (slack_ns == 0)
    2578           0 :                 p->timer_slack_ns = p->default_timer_slack_ns;
    2579             :         else
    2580           0 :                 p->timer_slack_ns = slack_ns;
    2581             :         task_unlock(p);
    2582             : 
    2583             : out:
    2584           0 :         put_task_struct(p);
    2585             : 
    2586           0 :         return count;
    2587             : }
    2588             : 
    2589           0 : static int timerslack_ns_show(struct seq_file *m, void *v)
    2590             : {
    2591           0 :         struct inode *inode = m->private;
    2592             :         struct task_struct *p;
    2593           0 :         int err = 0;
    2594             : 
    2595           0 :         p = get_proc_task(inode);
    2596           0 :         if (!p)
    2597             :                 return -ESRCH;
    2598             : 
    2599           0 :         if (p != current) {
    2600             :                 rcu_read_lock();
    2601           0 :                 if (!ns_capable(__task_cred(p)->user_ns, CAP_SYS_NICE)) {
    2602             :                         rcu_read_unlock();
    2603           0 :                         err = -EPERM;
    2604           0 :                         goto out;
    2605             :                 }
    2606             :                 rcu_read_unlock();
    2607             : 
    2608           0 :                 err = security_task_getscheduler(p);
    2609             :                 if (err)
    2610             :                         goto out;
    2611             :         }
    2612             : 
    2613             :         task_lock(p);
    2614           0 :         seq_printf(m, "%llu\n", p->timer_slack_ns);
    2615             :         task_unlock(p);
    2616             : 
    2617             : out:
    2618           0 :         put_task_struct(p);
    2619             : 
    2620           0 :         return err;
    2621             : }
    2622             : 
    2623           0 : static int timerslack_ns_open(struct inode *inode, struct file *filp)
    2624             : {
    2625           0 :         return single_open(filp, timerslack_ns_show, inode);
    2626             : }
    2627             : 
    2628             : static const struct file_operations proc_pid_set_timerslack_ns_operations = {
    2629             :         .open           = timerslack_ns_open,
    2630             :         .read           = seq_read,
    2631             :         .write          = timerslack_ns_write,
    2632             :         .llseek         = seq_lseek,
    2633             :         .release        = single_release,
    2634             : };
    2635             : 
    2636           0 : static struct dentry *proc_pident_instantiate(struct dentry *dentry,
    2637             :         struct task_struct *task, const void *ptr)
    2638             : {
    2639           0 :         const struct pid_entry *p = ptr;
    2640             :         struct inode *inode;
    2641             :         struct proc_inode *ei;
    2642             : 
    2643           0 :         inode = proc_pid_make_inode(dentry->d_sb, task, p->mode);
    2644           0 :         if (!inode)
    2645             :                 return ERR_PTR(-ENOENT);
    2646             : 
    2647           0 :         ei = PROC_I(inode);
    2648           0 :         if (S_ISDIR(inode->i_mode))
    2649           0 :                 set_nlink(inode, 2);    /* Use getattr to fix if necessary */
    2650           0 :         if (p->iop)
    2651           0 :                 inode->i_op = p->iop;
    2652           0 :         if (p->fop)
    2653           0 :                 inode->i_fop = p->fop;
    2654           0 :         ei->op = p->op;
    2655           0 :         pid_update_inode(task, inode);
    2656           0 :         d_set_d_op(dentry, &pid_dentry_operations);
    2657           0 :         return d_splice_alias(inode, dentry);
    2658             : }
    2659             : 
    2660           0 : static struct dentry *proc_pident_lookup(struct inode *dir, 
    2661             :                                          struct dentry *dentry,
    2662             :                                          const struct pid_entry *p,
    2663             :                                          const struct pid_entry *end)
    2664             : {
    2665           0 :         struct task_struct *task = get_proc_task(dir);
    2666           0 :         struct dentry *res = ERR_PTR(-ENOENT);
    2667             : 
    2668           0 :         if (!task)
    2669             :                 goto out_no_task;
    2670             : 
    2671             :         /*
    2672             :          * Yes, it does not scale. And it should not. Don't add
    2673             :          * new entries into /proc/<tgid>/ without very good reasons.
    2674             :          */
    2675           0 :         for (; p < end; p++) {
    2676           0 :                 if (p->len != dentry->d_name.len)
    2677           0 :                         continue;
    2678           0 :                 if (!memcmp(dentry->d_name.name, p->name, p->len)) {
    2679           0 :                         res = proc_pident_instantiate(dentry, task, p);
    2680           0 :                         break;
    2681             :                 }
    2682             :         }
    2683           0 :         put_task_struct(task);
    2684             : out_no_task:
    2685           0 :         return res;
    2686             : }
    2687             : 
    2688           0 : static int proc_pident_readdir(struct file *file, struct dir_context *ctx,
    2689             :                 const struct pid_entry *ents, unsigned int nents)
    2690             : {
    2691           0 :         struct task_struct *task = get_proc_task(file_inode(file));
    2692             :         const struct pid_entry *p;
    2693             : 
    2694           0 :         if (!task)
    2695             :                 return -ENOENT;
    2696             : 
    2697           0 :         if (!dir_emit_dots(file, ctx))
    2698             :                 goto out;
    2699             : 
    2700           0 :         if (ctx->pos >= nents + 2)
    2701             :                 goto out;
    2702             : 
    2703           0 :         for (p = ents + (ctx->pos - 2); p < ents + nents; p++) {
    2704           0 :                 if (!proc_fill_cache(file, ctx, p->name, p->len,
    2705             :                                 proc_pident_instantiate, task, p))
    2706             :                         break;
    2707           0 :                 ctx->pos++;
    2708             :         }
    2709             : out:
    2710           0 :         put_task_struct(task);
    2711           0 :         return 0;
    2712             : }
    2713             : 
    2714             : #ifdef CONFIG_SECURITY
    2715             : static int proc_pid_attr_open(struct inode *inode, struct file *file)
    2716             : {
    2717             :         file->private_data = NULL;
    2718             :         __mem_open(inode, file, PTRACE_MODE_READ_FSCREDS);
    2719             :         return 0;
    2720             : }
    2721             : 
    2722             : static ssize_t proc_pid_attr_read(struct file * file, char __user * buf,
    2723             :                                   size_t count, loff_t *ppos)
    2724             : {
    2725             :         struct inode * inode = file_inode(file);
    2726             :         char *p = NULL;
    2727             :         ssize_t length;
    2728             :         struct task_struct *task = get_proc_task(inode);
    2729             : 
    2730             :         if (!task)
    2731             :                 return -ESRCH;
    2732             : 
    2733             :         length = security_getprocattr(task, PROC_I(inode)->op.lsm,
    2734             :                                       file->f_path.dentry->d_name.name,
    2735             :                                       &p);
    2736             :         put_task_struct(task);
    2737             :         if (length > 0)
    2738             :                 length = simple_read_from_buffer(buf, count, ppos, p, length);
    2739             :         kfree(p);
    2740             :         return length;
    2741             : }
    2742             : 
    2743             : static ssize_t proc_pid_attr_write(struct file * file, const char __user * buf,
    2744             :                                    size_t count, loff_t *ppos)
    2745             : {
    2746             :         struct inode * inode = file_inode(file);
    2747             :         struct task_struct *task;
    2748             :         void *page;
    2749             :         int rv;
    2750             : 
    2751             :         /* A task may only write when it was the opener. */
    2752             :         if (file->private_data != current->mm)
    2753             :                 return -EPERM;
    2754             : 
    2755             :         rcu_read_lock();
    2756             :         task = pid_task(proc_pid(inode), PIDTYPE_PID);
    2757             :         if (!task) {
    2758             :                 rcu_read_unlock();
    2759             :                 return -ESRCH;
    2760             :         }
    2761             :         /* A task may only write its own attributes. */
    2762             :         if (current != task) {
    2763             :                 rcu_read_unlock();
    2764             :                 return -EACCES;
    2765             :         }
    2766             :         /* Prevent changes to overridden credentials. */
    2767             :         if (current_cred() != current_real_cred()) {
    2768             :                 rcu_read_unlock();
    2769             :                 return -EBUSY;
    2770             :         }
    2771             :         rcu_read_unlock();
    2772             : 
    2773             :         if (count > PAGE_SIZE)
    2774             :                 count = PAGE_SIZE;
    2775             : 
    2776             :         /* No partial writes. */
    2777             :         if (*ppos != 0)
    2778             :                 return -EINVAL;
    2779             : 
    2780             :         page = memdup_user(buf, count);
    2781             :         if (IS_ERR(page)) {
    2782             :                 rv = PTR_ERR(page);
    2783             :                 goto out;
    2784             :         }
    2785             : 
    2786             :         /* Guard against adverse ptrace interaction */
    2787             :         rv = mutex_lock_interruptible(&current->signal->cred_guard_mutex);
    2788             :         if (rv < 0)
    2789             :                 goto out_free;
    2790             : 
    2791             :         rv = security_setprocattr(PROC_I(inode)->op.lsm,
    2792             :                                   file->f_path.dentry->d_name.name, page,
    2793             :                                   count);
    2794             :         mutex_unlock(&current->signal->cred_guard_mutex);
    2795             : out_free:
    2796             :         kfree(page);
    2797             : out:
    2798             :         return rv;
    2799             : }
    2800             : 
    2801             : static const struct file_operations proc_pid_attr_operations = {
    2802             :         .open           = proc_pid_attr_open,
    2803             :         .read           = proc_pid_attr_read,
    2804             :         .write          = proc_pid_attr_write,
    2805             :         .llseek         = generic_file_llseek,
    2806             :         .release        = mem_release,
    2807             : };
    2808             : 
    2809             : #define LSM_DIR_OPS(LSM) \
    2810             : static int proc_##LSM##_attr_dir_iterate(struct file *filp, \
    2811             :                              struct dir_context *ctx) \
    2812             : { \
    2813             :         return proc_pident_readdir(filp, ctx, \
    2814             :                                    LSM##_attr_dir_stuff, \
    2815             :                                    ARRAY_SIZE(LSM##_attr_dir_stuff)); \
    2816             : } \
    2817             : \
    2818             : static const struct file_operations proc_##LSM##_attr_dir_ops = { \
    2819             :         .read           = generic_read_dir, \
    2820             :         .iterate        = proc_##LSM##_attr_dir_iterate, \
    2821             :         .llseek         = default_llseek, \
    2822             : }; \
    2823             : \
    2824             : static struct dentry *proc_##LSM##_attr_dir_lookup(struct inode *dir, \
    2825             :                                 struct dentry *dentry, unsigned int flags) \
    2826             : { \
    2827             :         return proc_pident_lookup(dir, dentry, \
    2828             :                                   LSM##_attr_dir_stuff, \
    2829             :                                   LSM##_attr_dir_stuff + ARRAY_SIZE(LSM##_attr_dir_stuff)); \
    2830             : } \
    2831             : \
    2832             : static const struct inode_operations proc_##LSM##_attr_dir_inode_ops = { \
    2833             :         .lookup         = proc_##LSM##_attr_dir_lookup, \
    2834             :         .getattr        = pid_getattr, \
    2835             :         .setattr        = proc_setattr, \
    2836             : }
    2837             : 
    2838             : #ifdef CONFIG_SECURITY_SMACK
    2839             : static const struct pid_entry smack_attr_dir_stuff[] = {
    2840             :         ATTR("smack", "current",    0666),
    2841             : };
    2842             : LSM_DIR_OPS(smack);
    2843             : #endif
    2844             : 
    2845             : #ifdef CONFIG_SECURITY_APPARMOR
    2846             : static const struct pid_entry apparmor_attr_dir_stuff[] = {
    2847             :         ATTR("apparmor", "current", 0666),
    2848             :         ATTR("apparmor", "prev",    0444),
    2849             :         ATTR("apparmor", "exec",    0666),
    2850             : };
    2851             : LSM_DIR_OPS(apparmor);
    2852             : #endif
    2853             : 
    2854             : static const struct pid_entry attr_dir_stuff[] = {
    2855             :         ATTR(NULL, "current",         0666),
    2856             :         ATTR(NULL, "prev",            0444),
    2857             :         ATTR(NULL, "exec",            0666),
    2858             :         ATTR(NULL, "fscreate",                0666),
    2859             :         ATTR(NULL, "keycreate",               0666),
    2860             :         ATTR(NULL, "sockcreate",      0666),
    2861             : #ifdef CONFIG_SECURITY_SMACK
    2862             :         DIR("smack",                  0555,
    2863             :             proc_smack_attr_dir_inode_ops, proc_smack_attr_dir_ops),
    2864             : #endif
    2865             : #ifdef CONFIG_SECURITY_APPARMOR
    2866             :         DIR("apparmor",                       0555,
    2867             :             proc_apparmor_attr_dir_inode_ops, proc_apparmor_attr_dir_ops),
    2868             : #endif
    2869             : };
    2870             : 
    2871             : static int proc_attr_dir_readdir(struct file *file, struct dir_context *ctx)
    2872             : {
    2873             :         return proc_pident_readdir(file, ctx, 
    2874             :                                    attr_dir_stuff, ARRAY_SIZE(attr_dir_stuff));
    2875             : }
    2876             : 
    2877             : static const struct file_operations proc_attr_dir_operations = {
    2878             :         .read           = generic_read_dir,
    2879             :         .iterate_shared = proc_attr_dir_readdir,
    2880             :         .llseek         = generic_file_llseek,
    2881             : };
    2882             : 
    2883             : static struct dentry *proc_attr_dir_lookup(struct inode *dir,
    2884             :                                 struct dentry *dentry, unsigned int flags)
    2885             : {
    2886             :         return proc_pident_lookup(dir, dentry,
    2887             :                                   attr_dir_stuff,
    2888             :                                   attr_dir_stuff + ARRAY_SIZE(attr_dir_stuff));
    2889             : }
    2890             : 
    2891             : static const struct inode_operations proc_attr_dir_inode_operations = {
    2892             :         .lookup         = proc_attr_dir_lookup,
    2893             :         .getattr        = pid_getattr,
    2894             :         .setattr        = proc_setattr,
    2895             : };
    2896             : 
    2897             : #endif
    2898             : 
    2899             : #ifdef CONFIG_ELF_CORE
    2900           0 : static ssize_t proc_coredump_filter_read(struct file *file, char __user *buf,
    2901             :                                          size_t count, loff_t *ppos)
    2902             : {
    2903           0 :         struct task_struct *task = get_proc_task(file_inode(file));
    2904             :         struct mm_struct *mm;
    2905             :         char buffer[PROC_NUMBUF];
    2906             :         size_t len;
    2907             :         int ret;
    2908             : 
    2909           0 :         if (!task)
    2910             :                 return -ESRCH;
    2911             : 
    2912           0 :         ret = 0;
    2913           0 :         mm = get_task_mm(task);
    2914           0 :         if (mm) {
    2915           0 :                 len = snprintf(buffer, sizeof(buffer), "%08lx\n",
    2916           0 :                                ((mm->flags & MMF_DUMP_FILTER_MASK) >>
    2917             :                                 MMF_DUMP_FILTER_SHIFT));
    2918           0 :                 mmput(mm);
    2919           0 :                 ret = simple_read_from_buffer(buf, count, ppos, buffer, len);
    2920             :         }
    2921             : 
    2922           0 :         put_task_struct(task);
    2923             : 
    2924           0 :         return ret;
    2925             : }
    2926             : 
    2927           0 : static ssize_t proc_coredump_filter_write(struct file *file,
    2928             :                                           const char __user *buf,
    2929             :                                           size_t count,
    2930             :                                           loff_t *ppos)
    2931             : {
    2932             :         struct task_struct *task;
    2933             :         struct mm_struct *mm;
    2934             :         unsigned int val;
    2935             :         int ret;
    2936             :         int i;
    2937             :         unsigned long mask;
    2938             : 
    2939           0 :         ret = kstrtouint_from_user(buf, count, 0, &val);
    2940           0 :         if (ret < 0)
    2941           0 :                 return ret;
    2942             : 
    2943           0 :         ret = -ESRCH;
    2944           0 :         task = get_proc_task(file_inode(file));
    2945           0 :         if (!task)
    2946             :                 goto out_no_task;
    2947             : 
    2948           0 :         mm = get_task_mm(task);
    2949           0 :         if (!mm)
    2950             :                 goto out_no_mm;
    2951             :         ret = 0;
    2952             : 
    2953           0 :         for (i = 0, mask = 1; i < MMF_DUMP_FILTER_BITS; i++, mask <<= 1) {
    2954           0 :                 if (val & mask)
    2955           0 :                         set_bit(i + MMF_DUMP_FILTER_SHIFT, &mm->flags);
    2956             :                 else
    2957           0 :                         clear_bit(i + MMF_DUMP_FILTER_SHIFT, &mm->flags);
    2958             :         }
    2959             : 
    2960           0 :         mmput(mm);
    2961             :  out_no_mm:
    2962           0 :         put_task_struct(task);
    2963             :  out_no_task:
    2964           0 :         if (ret < 0)
    2965           0 :                 return ret;
    2966           0 :         return count;
    2967             : }
    2968             : 
    2969             : static const struct file_operations proc_coredump_filter_operations = {
    2970             :         .read           = proc_coredump_filter_read,
    2971             :         .write          = proc_coredump_filter_write,
    2972             :         .llseek         = generic_file_llseek,
    2973             : };
    2974             : #endif
    2975             : 
    2976             : #ifdef CONFIG_TASK_IO_ACCOUNTING
    2977             : static int do_io_accounting(struct task_struct *task, struct seq_file *m, int whole)
    2978             : {
    2979             :         struct task_io_accounting acct = task->ioac;
    2980             :         unsigned long flags;
    2981             :         int result;
    2982             : 
    2983             :         result = down_read_killable(&task->signal->exec_update_lock);
    2984             :         if (result)
    2985             :                 return result;
    2986             : 
    2987             :         if (!ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS)) {
    2988             :                 result = -EACCES;
    2989             :                 goto out_unlock;
    2990             :         }
    2991             : 
    2992             :         if (whole && lock_task_sighand(task, &flags)) {
    2993             :                 struct task_struct *t = task;
    2994             : 
    2995             :                 task_io_accounting_add(&acct, &task->signal->ioac);
    2996             :                 while_each_thread(task, t)
    2997             :                         task_io_accounting_add(&acct, &t->ioac);
    2998             : 
    2999             :                 unlock_task_sighand(task, &flags);
    3000             :         }
    3001             :         seq_printf(m,
    3002             :                    "rchar: %llu\n"
    3003             :                    "wchar: %llu\n"
    3004             :                    "syscr: %llu\n"
    3005             :                    "syscw: %llu\n"
    3006             :                    "read_bytes: %llu\n"
    3007             :                    "write_bytes: %llu\n"
    3008             :                    "cancelled_write_bytes: %llu\n",
    3009             :                    (unsigned long long)acct.rchar,
    3010             :                    (unsigned long long)acct.wchar,
    3011             :                    (unsigned long long)acct.syscr,
    3012             :                    (unsigned long long)acct.syscw,
    3013             :                    (unsigned long long)acct.read_bytes,
    3014             :                    (unsigned long long)acct.write_bytes,
    3015             :                    (unsigned long long)acct.cancelled_write_bytes);
    3016             :         result = 0;
    3017             : 
    3018             : out_unlock:
    3019             :         up_read(&task->signal->exec_update_lock);
    3020             :         return result;
    3021             : }
    3022             : 
    3023             : static int proc_tid_io_accounting(struct seq_file *m, struct pid_namespace *ns,
    3024             :                                   struct pid *pid, struct task_struct *task)
    3025             : {
    3026             :         return do_io_accounting(task, m, 0);
    3027             : }
    3028             : 
    3029             : static int proc_tgid_io_accounting(struct seq_file *m, struct pid_namespace *ns,
    3030             :                                    struct pid *pid, struct task_struct *task)
    3031             : {
    3032             :         return do_io_accounting(task, m, 1);
    3033             : }
    3034             : #endif /* CONFIG_TASK_IO_ACCOUNTING */
    3035             : 
    3036             : #ifdef CONFIG_USER_NS
    3037             : static int proc_id_map_open(struct inode *inode, struct file *file,
    3038             :         const struct seq_operations *seq_ops)
    3039             : {
    3040             :         struct user_namespace *ns = NULL;
    3041             :         struct task_struct *task;
    3042             :         struct seq_file *seq;
    3043             :         int ret = -EINVAL;
    3044             : 
    3045             :         task = get_proc_task(inode);
    3046             :         if (task) {
    3047             :                 rcu_read_lock();
    3048             :                 ns = get_user_ns(task_cred_xxx(task, user_ns));
    3049             :                 rcu_read_unlock();
    3050             :                 put_task_struct(task);
    3051             :         }
    3052             :         if (!ns)
    3053             :                 goto err;
    3054             : 
    3055             :         ret = seq_open(file, seq_ops);
    3056             :         if (ret)
    3057             :                 goto err_put_ns;
    3058             : 
    3059             :         seq = file->private_data;
    3060             :         seq->private = ns;
    3061             : 
    3062             :         return 0;
    3063             : err_put_ns:
    3064             :         put_user_ns(ns);
    3065             : err:
    3066             :         return ret;
    3067             : }
    3068             : 
    3069             : static int proc_id_map_release(struct inode *inode, struct file *file)
    3070             : {
    3071             :         struct seq_file *seq = file->private_data;
    3072             :         struct user_namespace *ns = seq->private;
    3073             :         put_user_ns(ns);
    3074             :         return seq_release(inode, file);
    3075             : }
    3076             : 
    3077             : static int proc_uid_map_open(struct inode *inode, struct file *file)
    3078             : {
    3079             :         return proc_id_map_open(inode, file, &proc_uid_seq_operations);
    3080             : }
    3081             : 
    3082             : static int proc_gid_map_open(struct inode *inode, struct file *file)
    3083             : {
    3084             :         return proc_id_map_open(inode, file, &proc_gid_seq_operations);
    3085             : }
    3086             : 
    3087             : static int proc_projid_map_open(struct inode *inode, struct file *file)
    3088             : {
    3089             :         return proc_id_map_open(inode, file, &proc_projid_seq_operations);
    3090             : }
    3091             : 
    3092             : static const struct file_operations proc_uid_map_operations = {
    3093             :         .open           = proc_uid_map_open,
    3094             :         .write          = proc_uid_map_write,
    3095             :         .read           = seq_read,
    3096             :         .llseek         = seq_lseek,
    3097             :         .release        = proc_id_map_release,
    3098             : };
    3099             : 
    3100             : static const struct file_operations proc_gid_map_operations = {
    3101             :         .open           = proc_gid_map_open,
    3102             :         .write          = proc_gid_map_write,
    3103             :         .read           = seq_read,
    3104             :         .llseek         = seq_lseek,
    3105             :         .release        = proc_id_map_release,
    3106             : };
    3107             : 
    3108             : static const struct file_operations proc_projid_map_operations = {
    3109             :         .open           = proc_projid_map_open,
    3110             :         .write          = proc_projid_map_write,
    3111             :         .read           = seq_read,
    3112             :         .llseek         = seq_lseek,
    3113             :         .release        = proc_id_map_release,
    3114             : };
    3115             : 
    3116             : static int proc_setgroups_open(struct inode *inode, struct file *file)
    3117             : {
    3118             :         struct user_namespace *ns = NULL;
    3119             :         struct task_struct *task;
    3120             :         int ret;
    3121             : 
    3122             :         ret = -ESRCH;
    3123             :         task = get_proc_task(inode);
    3124             :         if (task) {
    3125             :                 rcu_read_lock();
    3126             :                 ns = get_user_ns(task_cred_xxx(task, user_ns));
    3127             :                 rcu_read_unlock();
    3128             :                 put_task_struct(task);
    3129             :         }
    3130             :         if (!ns)
    3131             :                 goto err;
    3132             : 
    3133             :         if (file->f_mode & FMODE_WRITE) {
    3134             :                 ret = -EACCES;
    3135             :                 if (!ns_capable(ns, CAP_SYS_ADMIN))
    3136             :                         goto err_put_ns;
    3137             :         }
    3138             : 
    3139             :         ret = single_open(file, &proc_setgroups_show, ns);
    3140             :         if (ret)
    3141             :                 goto err_put_ns;
    3142             : 
    3143             :         return 0;
    3144             : err_put_ns:
    3145             :         put_user_ns(ns);
    3146             : err:
    3147             :         return ret;
    3148             : }
    3149             : 
    3150             : static int proc_setgroups_release(struct inode *inode, struct file *file)
    3151             : {
    3152             :         struct seq_file *seq = file->private_data;
    3153             :         struct user_namespace *ns = seq->private;
    3154             :         int ret = single_release(inode, file);
    3155             :         put_user_ns(ns);
    3156             :         return ret;
    3157             : }
    3158             : 
    3159             : static const struct file_operations proc_setgroups_operations = {
    3160             :         .open           = proc_setgroups_open,
    3161             :         .write          = proc_setgroups_write,
    3162             :         .read           = seq_read,
    3163             :         .llseek         = seq_lseek,
    3164             :         .release        = proc_setgroups_release,
    3165             : };
    3166             : #endif /* CONFIG_USER_NS */
    3167             : 
    3168           0 : static int proc_pid_personality(struct seq_file *m, struct pid_namespace *ns,
    3169             :                                 struct pid *pid, struct task_struct *task)
    3170             : {
    3171           0 :         int err = lock_trace(task);
    3172           0 :         if (!err) {
    3173           0 :                 seq_printf(m, "%08x\n", task->personality);
    3174           0 :                 unlock_trace(task);
    3175             :         }
    3176           0 :         return err;
    3177             : }
    3178             : 
    3179             : #ifdef CONFIG_LIVEPATCH
    3180             : static int proc_pid_patch_state(struct seq_file *m, struct pid_namespace *ns,
    3181             :                                 struct pid *pid, struct task_struct *task)
    3182             : {
    3183             :         seq_printf(m, "%d\n", task->patch_state);
    3184             :         return 0;
    3185             : }
    3186             : #endif /* CONFIG_LIVEPATCH */
    3187             : 
    3188             : #ifdef CONFIG_KSM
    3189             : static int proc_pid_ksm_merging_pages(struct seq_file *m, struct pid_namespace *ns,
    3190             :                                 struct pid *pid, struct task_struct *task)
    3191             : {
    3192             :         struct mm_struct *mm;
    3193             : 
    3194             :         mm = get_task_mm(task);
    3195             :         if (mm) {
    3196             :                 seq_printf(m, "%lu\n", mm->ksm_merging_pages);
    3197             :                 mmput(mm);
    3198             :         }
    3199             : 
    3200             :         return 0;
    3201             : }
    3202             : static int proc_pid_ksm_stat(struct seq_file *m, struct pid_namespace *ns,
    3203             :                                 struct pid *pid, struct task_struct *task)
    3204             : {
    3205             :         struct mm_struct *mm;
    3206             : 
    3207             :         mm = get_task_mm(task);
    3208             :         if (mm) {
    3209             :                 seq_printf(m, "ksm_rmap_items %lu\n", mm->ksm_rmap_items);
    3210             :                 mmput(mm);
    3211             :         }
    3212             : 
    3213             :         return 0;
    3214             : }
    3215             : #endif /* CONFIG_KSM */
    3216             : 
    3217             : #ifdef CONFIG_STACKLEAK_METRICS
    3218             : static int proc_stack_depth(struct seq_file *m, struct pid_namespace *ns,
    3219             :                                 struct pid *pid, struct task_struct *task)
    3220             : {
    3221             :         unsigned long prev_depth = THREAD_SIZE -
    3222             :                                 (task->prev_lowest_stack & (THREAD_SIZE - 1));
    3223             :         unsigned long depth = THREAD_SIZE -
    3224             :                                 (task->lowest_stack & (THREAD_SIZE - 1));
    3225             : 
    3226             :         seq_printf(m, "previous stack depth: %lu\nstack depth: %lu\n",
    3227             :                                                         prev_depth, depth);
    3228             :         return 0;
    3229             : }
    3230             : #endif /* CONFIG_STACKLEAK_METRICS */
    3231             : 
    3232             : /*
    3233             :  * Thread groups
    3234             :  */
    3235             : static const struct file_operations proc_task_operations;
    3236             : static const struct inode_operations proc_task_inode_operations;
    3237             : 
    3238             : static const struct pid_entry tgid_base_stuff[] = {
    3239             :         DIR("task",       S_IRUGO|S_IXUGO, proc_task_inode_operations, proc_task_operations),
    3240             :         DIR("fd",         S_IRUSR|S_IXUSR, proc_fd_inode_operations, proc_fd_operations),
    3241             :         DIR("map_files",  S_IRUSR|S_IXUSR, proc_map_files_inode_operations, proc_map_files_operations),
    3242             :         DIR("fdinfo",     S_IRUGO|S_IXUGO, proc_fdinfo_inode_operations, proc_fdinfo_operations),
    3243             :         DIR("ns",       S_IRUSR|S_IXUGO, proc_ns_dir_inode_operations, proc_ns_dir_operations),
    3244             : #ifdef CONFIG_NET
    3245             :         DIR("net",        S_IRUGO|S_IXUGO, proc_net_inode_operations, proc_net_operations),
    3246             : #endif
    3247             :         REG("environ",    S_IRUSR, proc_environ_operations),
    3248             :         REG("auxv",       S_IRUSR, proc_auxv_operations),
    3249             :         ONE("status",     S_IRUGO, proc_pid_status),
    3250             :         ONE("personality", S_IRUSR, proc_pid_personality),
    3251             :         ONE("limits",   S_IRUGO, proc_pid_limits),
    3252             : #ifdef CONFIG_SCHED_DEBUG
    3253             :         REG("sched",      S_IRUGO|S_IWUSR, proc_pid_sched_operations),
    3254             : #endif
    3255             : #ifdef CONFIG_SCHED_AUTOGROUP
    3256             :         REG("autogroup",  S_IRUGO|S_IWUSR, proc_pid_sched_autogroup_operations),
    3257             : #endif
    3258             : #ifdef CONFIG_TIME_NS
    3259             :         REG("timens_offsets",  S_IRUGO|S_IWUSR, proc_timens_offsets_operations),
    3260             : #endif
    3261             :         REG("comm",      S_IRUGO|S_IWUSR, proc_pid_set_comm_operations),
    3262             : #ifdef CONFIG_HAVE_ARCH_TRACEHOOK
    3263             :         ONE("syscall",    S_IRUSR, proc_pid_syscall),
    3264             : #endif
    3265             :         REG("cmdline",    S_IRUGO, proc_pid_cmdline_ops),
    3266             :         ONE("stat",       S_IRUGO, proc_tgid_stat),
    3267             :         ONE("statm",      S_IRUGO, proc_pid_statm),
    3268             :         REG("maps",       S_IRUGO, proc_pid_maps_operations),
    3269             : #ifdef CONFIG_NUMA
    3270             :         REG("numa_maps",  S_IRUGO, proc_pid_numa_maps_operations),
    3271             : #endif
    3272             :         REG("mem",        S_IRUSR|S_IWUSR, proc_mem_operations),
    3273             :         LNK("cwd",        proc_cwd_link),
    3274             :         LNK("root",       proc_root_link),
    3275             :         LNK("exe",        proc_exe_link),
    3276             :         REG("mounts",     S_IRUGO, proc_mounts_operations),
    3277             :         REG("mountinfo",  S_IRUGO, proc_mountinfo_operations),
    3278             :         REG("mountstats", S_IRUSR, proc_mountstats_operations),
    3279             : #ifdef CONFIG_PROC_PAGE_MONITOR
    3280             :         REG("clear_refs", S_IWUSR, proc_clear_refs_operations),
    3281             :         REG("smaps",      S_IRUGO, proc_pid_smaps_operations),
    3282             :         REG("smaps_rollup", S_IRUGO, proc_pid_smaps_rollup_operations),
    3283             :         REG("pagemap",    S_IRUSR, proc_pagemap_operations),
    3284             : #endif
    3285             : #ifdef CONFIG_SECURITY
    3286             :         DIR("attr",       S_IRUGO|S_IXUGO, proc_attr_dir_inode_operations, proc_attr_dir_operations),
    3287             : #endif
    3288             : #ifdef CONFIG_KALLSYMS
    3289             :         ONE("wchan",      S_IRUGO, proc_pid_wchan),
    3290             : #endif
    3291             : #ifdef CONFIG_STACKTRACE
    3292             :         ONE("stack",      S_IRUSR, proc_pid_stack),
    3293             : #endif
    3294             : #ifdef CONFIG_SCHED_INFO
    3295             :         ONE("schedstat",  S_IRUGO, proc_pid_schedstat),
    3296             : #endif
    3297             : #ifdef CONFIG_LATENCYTOP
    3298             :         REG("latency",  S_IRUGO, proc_lstats_operations),
    3299             : #endif
    3300             : #ifdef CONFIG_PROC_PID_CPUSET
    3301             :         ONE("cpuset",     S_IRUGO, proc_cpuset_show),
    3302             : #endif
    3303             : #ifdef CONFIG_CGROUPS
    3304             :         ONE("cgroup",  S_IRUGO, proc_cgroup_show),
    3305             : #endif
    3306             : #ifdef CONFIG_PROC_CPU_RESCTRL
    3307             :         ONE("cpu_resctrl_groups", S_IRUGO, proc_resctrl_show),
    3308             : #endif
    3309             :         ONE("oom_score",  S_IRUGO, proc_oom_score),
    3310             :         REG("oom_adj",    S_IRUGO|S_IWUSR, proc_oom_adj_operations),
    3311             :         REG("oom_score_adj", S_IRUGO|S_IWUSR, proc_oom_score_adj_operations),
    3312             : #ifdef CONFIG_AUDIT
    3313             :         REG("loginuid",   S_IWUSR|S_IRUGO, proc_loginuid_operations),
    3314             :         REG("sessionid",  S_IRUGO, proc_sessionid_operations),
    3315             : #endif
    3316             : #ifdef CONFIG_FAULT_INJECTION
    3317             :         REG("make-it-fail", S_IRUGO|S_IWUSR, proc_fault_inject_operations),
    3318             :         REG("fail-nth", 0644, proc_fail_nth_operations),
    3319             : #endif
    3320             : #ifdef CONFIG_ELF_CORE
    3321             :         REG("coredump_filter", S_IRUGO|S_IWUSR, proc_coredump_filter_operations),
    3322             : #endif
    3323             : #ifdef CONFIG_TASK_IO_ACCOUNTING
    3324             :         ONE("io",     S_IRUSR, proc_tgid_io_accounting),
    3325             : #endif
    3326             : #ifdef CONFIG_USER_NS
    3327             :         REG("uid_map",    S_IRUGO|S_IWUSR, proc_uid_map_operations),
    3328             :         REG("gid_map",    S_IRUGO|S_IWUSR, proc_gid_map_operations),
    3329             :         REG("projid_map", S_IRUGO|S_IWUSR, proc_projid_map_operations),
    3330             :         REG("setgroups",  S_IRUGO|S_IWUSR, proc_setgroups_operations),
    3331             : #endif
    3332             : #if defined(CONFIG_CHECKPOINT_RESTORE) && defined(CONFIG_POSIX_TIMERS)
    3333             :         REG("timers",   S_IRUGO, proc_timers_operations),
    3334             : #endif
    3335             :         REG("timerslack_ns", S_IRUGO|S_IWUGO, proc_pid_set_timerslack_ns_operations),
    3336             : #ifdef CONFIG_LIVEPATCH
    3337             :         ONE("patch_state",  S_IRUSR, proc_pid_patch_state),
    3338             : #endif
    3339             : #ifdef CONFIG_STACKLEAK_METRICS
    3340             :         ONE("stack_depth", S_IRUGO, proc_stack_depth),
    3341             : #endif
    3342             : #ifdef CONFIG_PROC_PID_ARCH_STATUS
    3343             :         ONE("arch_status", S_IRUGO, proc_pid_arch_status),
    3344             : #endif
    3345             : #ifdef CONFIG_SECCOMP_CACHE_DEBUG
    3346             :         ONE("seccomp_cache", S_IRUSR, proc_pid_seccomp_cache),
    3347             : #endif
    3348             : #ifdef CONFIG_KSM
    3349             :         ONE("ksm_merging_pages",  S_IRUSR, proc_pid_ksm_merging_pages),
    3350             :         ONE("ksm_stat",  S_IRUSR, proc_pid_ksm_stat),
    3351             : #endif
    3352             : };
    3353             : 
    3354           0 : static int proc_tgid_base_readdir(struct file *file, struct dir_context *ctx)
    3355             : {
    3356           0 :         return proc_pident_readdir(file, ctx,
    3357             :                                    tgid_base_stuff, ARRAY_SIZE(tgid_base_stuff));
    3358             : }
    3359             : 
    3360             : static const struct file_operations proc_tgid_base_operations = {
    3361             :         .read           = generic_read_dir,
    3362             :         .iterate_shared = proc_tgid_base_readdir,
    3363             :         .llseek         = generic_file_llseek,
    3364             : };
    3365             : 
    3366           0 : struct pid *tgid_pidfd_to_pid(const struct file *file)
    3367             : {
    3368           0 :         if (file->f_op != &proc_tgid_base_operations)
    3369             :                 return ERR_PTR(-EBADF);
    3370             : 
    3371           0 :         return proc_pid(file_inode(file));
    3372             : }
    3373             : 
    3374           0 : static struct dentry *proc_tgid_base_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
    3375             : {
    3376           0 :         return proc_pident_lookup(dir, dentry,
    3377             :                                   tgid_base_stuff,
    3378             :                                   tgid_base_stuff + ARRAY_SIZE(tgid_base_stuff));
    3379             : }
    3380             : 
    3381             : static const struct inode_operations proc_tgid_base_inode_operations = {
    3382             :         .lookup         = proc_tgid_base_lookup,
    3383             :         .getattr        = pid_getattr,
    3384             :         .setattr        = proc_setattr,
    3385             :         .permission     = proc_pid_permission,
    3386             : };
    3387             : 
    3388             : /**
    3389             :  * proc_flush_pid -  Remove dcache entries for @pid from the /proc dcache.
    3390             :  * @pid: pid that should be flushed.
    3391             :  *
    3392             :  * This function walks a list of inodes (that belong to any proc
    3393             :  * filesystem) that are attached to the pid and flushes them from
    3394             :  * the dentry cache.
    3395             :  *
    3396             :  * It is safe and reasonable to cache /proc entries for a task until
    3397             :  * that task exits.  After that they just clog up the dcache with
    3398             :  * useless entries, possibly causing useful dcache entries to be
    3399             :  * flushed instead.  This routine is provided to flush those useless
    3400             :  * dcache entries when a process is reaped.
    3401             :  *
    3402             :  * NOTE: This routine is just an optimization so it does not guarantee
    3403             :  *       that no dcache entries will exist after a process is reaped
    3404             :  *       it just makes it very unlikely that any will persist.
    3405             :  */
    3406             : 
    3407         325 : void proc_flush_pid(struct pid *pid)
    3408             : {
    3409         325 :         proc_invalidate_siblings_dcache(&pid->inodes, &pid->lock);
    3410         325 : }
    3411             : 
    3412           0 : static struct dentry *proc_pid_instantiate(struct dentry * dentry,
    3413             :                                    struct task_struct *task, const void *ptr)
    3414             : {
    3415             :         struct inode *inode;
    3416             : 
    3417           0 :         inode = proc_pid_make_base_inode(dentry->d_sb, task,
    3418             :                                          S_IFDIR | S_IRUGO | S_IXUGO);
    3419           0 :         if (!inode)
    3420             :                 return ERR_PTR(-ENOENT);
    3421             : 
    3422           0 :         inode->i_op = &proc_tgid_base_inode_operations;
    3423           0 :         inode->i_fop = &proc_tgid_base_operations;
    3424           0 :         inode->i_flags|=S_IMMUTABLE;
    3425             : 
    3426           0 :         set_nlink(inode, nlink_tgid);
    3427           0 :         pid_update_inode(task, inode);
    3428             : 
    3429           0 :         d_set_d_op(dentry, &pid_dentry_operations);
    3430           0 :         return d_splice_alias(inode, dentry);
    3431             : }
    3432             : 
    3433           0 : struct dentry *proc_pid_lookup(struct dentry *dentry, unsigned int flags)
    3434             : {
    3435             :         struct task_struct *task;
    3436             :         unsigned tgid;
    3437             :         struct proc_fs_info *fs_info;
    3438             :         struct pid_namespace *ns;
    3439           0 :         struct dentry *result = ERR_PTR(-ENOENT);
    3440             : 
    3441           0 :         tgid = name_to_int(&dentry->d_name);
    3442           0 :         if (tgid == ~0U)
    3443             :                 goto out;
    3444             : 
    3445           0 :         fs_info = proc_sb_info(dentry->d_sb);
    3446           0 :         ns = fs_info->pid_ns;
    3447             :         rcu_read_lock();
    3448           0 :         task = find_task_by_pid_ns(tgid, ns);
    3449           0 :         if (task)
    3450             :                 get_task_struct(task);
    3451             :         rcu_read_unlock();
    3452           0 :         if (!task)
    3453             :                 goto out;
    3454             : 
    3455             :         /* Limit procfs to only ptraceable tasks */
    3456           0 :         if (fs_info->hide_pid == HIDEPID_NOT_PTRACEABLE) {
    3457           0 :                 if (!has_pid_permissions(fs_info, task, HIDEPID_NO_ACCESS))
    3458             :                         goto out_put_task;
    3459             :         }
    3460             : 
    3461           0 :         result = proc_pid_instantiate(dentry, task, NULL);
    3462             : out_put_task:
    3463           0 :         put_task_struct(task);
    3464             : out:
    3465           0 :         return result;
    3466             : }
    3467             : 
    3468             : /*
    3469             :  * Find the first task with tgid >= tgid
    3470             :  *
    3471             :  */
    3472             : struct tgid_iter {
    3473             :         unsigned int tgid;
    3474             :         struct task_struct *task;
    3475             : };
    3476           0 : static struct tgid_iter next_tgid(struct pid_namespace *ns, struct tgid_iter iter)
    3477             : {
    3478             :         struct pid *pid;
    3479             : 
    3480           0 :         if (iter.task)
    3481           0 :                 put_task_struct(iter.task);
    3482             :         rcu_read_lock();
    3483             : retry:
    3484           0 :         iter.task = NULL;
    3485           0 :         pid = find_ge_pid(iter.tgid, ns);
    3486           0 :         if (pid) {
    3487           0 :                 iter.tgid = pid_nr_ns(pid, ns);
    3488           0 :                 iter.task = pid_task(pid, PIDTYPE_TGID);
    3489           0 :                 if (!iter.task) {
    3490           0 :                         iter.tgid += 1;
    3491           0 :                         goto retry;
    3492             :                 }
    3493           0 :                 get_task_struct(iter.task);
    3494             :         }
    3495             :         rcu_read_unlock();
    3496           0 :         return iter;
    3497             : }
    3498             : 
    3499             : #define TGID_OFFSET (FIRST_PROCESS_ENTRY + 2)
    3500             : 
    3501             : /* for the /proc/ directory itself, after non-process stuff has been done */
    3502           0 : int proc_pid_readdir(struct file *file, struct dir_context *ctx)
    3503             : {
    3504             :         struct tgid_iter iter;
    3505           0 :         struct proc_fs_info *fs_info = proc_sb_info(file_inode(file)->i_sb);
    3506           0 :         struct pid_namespace *ns = proc_pid_ns(file_inode(file)->i_sb);
    3507           0 :         loff_t pos = ctx->pos;
    3508             : 
    3509           0 :         if (pos >= PID_MAX_LIMIT + TGID_OFFSET)
    3510             :                 return 0;
    3511             : 
    3512           0 :         if (pos == TGID_OFFSET - 2) {
    3513           0 :                 struct inode *inode = d_inode(fs_info->proc_self);
    3514           0 :                 if (!dir_emit(ctx, "self", 4, inode->i_ino, DT_LNK))
    3515             :                         return 0;
    3516           0 :                 ctx->pos = pos = pos + 1;
    3517             :         }
    3518           0 :         if (pos == TGID_OFFSET - 1) {
    3519           0 :                 struct inode *inode = d_inode(fs_info->proc_thread_self);
    3520           0 :                 if (!dir_emit(ctx, "thread-self", 11, inode->i_ino, DT_LNK))
    3521             :                         return 0;
    3522           0 :                 ctx->pos = pos = pos + 1;
    3523             :         }
    3524           0 :         iter.tgid = pos - TGID_OFFSET;
    3525           0 :         iter.task = NULL;
    3526           0 :         for (iter = next_tgid(ns, iter);
    3527             :              iter.task;
    3528           0 :              iter.tgid += 1, iter = next_tgid(ns, iter)) {
    3529             :                 char name[10 + 1];
    3530             :                 unsigned int len;
    3531             : 
    3532           0 :                 cond_resched();
    3533           0 :                 if (!has_pid_permissions(fs_info, iter.task, HIDEPID_INVISIBLE))
    3534           0 :                         continue;
    3535             : 
    3536           0 :                 len = snprintf(name, sizeof(name), "%u", iter.tgid);
    3537           0 :                 ctx->pos = iter.tgid + TGID_OFFSET;
    3538           0 :                 if (!proc_fill_cache(file, ctx, name, len,
    3539             :                                      proc_pid_instantiate, iter.task, NULL)) {
    3540           0 :                         put_task_struct(iter.task);
    3541           0 :                         return 0;
    3542             :                 }
    3543             :         }
    3544           0 :         ctx->pos = PID_MAX_LIMIT + TGID_OFFSET;
    3545           0 :         return 0;
    3546             : }
    3547             : 
    3548             : /*
    3549             :  * proc_tid_comm_permission is a special permission function exclusively
    3550             :  * used for the node /proc/<pid>/task/<tid>/comm.
    3551             :  * It bypasses generic permission checks in the case where a task of the same
    3552             :  * task group attempts to access the node.
    3553             :  * The rationale behind this is that glibc and bionic access this node for
    3554             :  * cross thread naming (pthread_set/getname_np(!self)). However, if
    3555             :  * PR_SET_DUMPABLE gets set to 0 this node among others becomes uid=0 gid=0,
    3556             :  * which locks out the cross thread naming implementation.
    3557             :  * This function makes sure that the node is always accessible for members of
    3558             :  * same thread group.
    3559             :  */
    3560           0 : static int proc_tid_comm_permission(struct mnt_idmap *idmap,
    3561             :                                     struct inode *inode, int mask)
    3562             : {
    3563             :         bool is_same_tgroup;
    3564             :         struct task_struct *task;
    3565             : 
    3566           0 :         task = get_proc_task(inode);
    3567           0 :         if (!task)
    3568             :                 return -ESRCH;
    3569           0 :         is_same_tgroup = same_thread_group(current, task);
    3570           0 :         put_task_struct(task);
    3571             : 
    3572           0 :         if (likely(is_same_tgroup && !(mask & MAY_EXEC))) {
    3573             :                 /* This file (/proc/<pid>/task/<tid>/comm) can always be
    3574             :                  * read or written by the members of the corresponding
    3575             :                  * thread group.
    3576             :                  */
    3577             :                 return 0;
    3578             :         }
    3579             : 
    3580           0 :         return generic_permission(&nop_mnt_idmap, inode, mask);
    3581             : }
    3582             : 
    3583             : static const struct inode_operations proc_tid_comm_inode_operations = {
    3584             :                 .permission = proc_tid_comm_permission,
    3585             : };
    3586             : 
    3587             : /*
    3588             :  * Tasks
    3589             :  */
    3590             : static const struct pid_entry tid_base_stuff[] = {
    3591             :         DIR("fd",        S_IRUSR|S_IXUSR, proc_fd_inode_operations, proc_fd_operations),
    3592             :         DIR("fdinfo",    S_IRUGO|S_IXUGO, proc_fdinfo_inode_operations, proc_fdinfo_operations),
    3593             :         DIR("ns",      S_IRUSR|S_IXUGO, proc_ns_dir_inode_operations, proc_ns_dir_operations),
    3594             : #ifdef CONFIG_NET
    3595             :         DIR("net",        S_IRUGO|S_IXUGO, proc_net_inode_operations, proc_net_operations),
    3596             : #endif
    3597             :         REG("environ",   S_IRUSR, proc_environ_operations),
    3598             :         REG("auxv",      S_IRUSR, proc_auxv_operations),
    3599             :         ONE("status",    S_IRUGO, proc_pid_status),
    3600             :         ONE("personality", S_IRUSR, proc_pid_personality),
    3601             :         ONE("limits",  S_IRUGO, proc_pid_limits),
    3602             : #ifdef CONFIG_SCHED_DEBUG
    3603             :         REG("sched",     S_IRUGO|S_IWUSR, proc_pid_sched_operations),
    3604             : #endif
    3605             :         NOD("comm",      S_IFREG|S_IRUGO|S_IWUSR,
    3606             :                          &proc_tid_comm_inode_operations,
    3607             :                          &proc_pid_set_comm_operations, {}),
    3608             : #ifdef CONFIG_HAVE_ARCH_TRACEHOOK
    3609             :         ONE("syscall",   S_IRUSR, proc_pid_syscall),
    3610             : #endif
    3611             :         REG("cmdline",   S_IRUGO, proc_pid_cmdline_ops),
    3612             :         ONE("stat",      S_IRUGO, proc_tid_stat),
    3613             :         ONE("statm",     S_IRUGO, proc_pid_statm),
    3614             :         REG("maps",      S_IRUGO, proc_pid_maps_operations),
    3615             : #ifdef CONFIG_PROC_CHILDREN
    3616             :         REG("children",  S_IRUGO, proc_tid_children_operations),
    3617             : #endif
    3618             : #ifdef CONFIG_NUMA
    3619             :         REG("numa_maps", S_IRUGO, proc_pid_numa_maps_operations),
    3620             : #endif
    3621             :         REG("mem",       S_IRUSR|S_IWUSR, proc_mem_operations),
    3622             :         LNK("cwd",       proc_cwd_link),
    3623             :         LNK("root",      proc_root_link),
    3624             :         LNK("exe",       proc_exe_link),
    3625             :         REG("mounts",    S_IRUGO, proc_mounts_operations),
    3626             :         REG("mountinfo",  S_IRUGO, proc_mountinfo_operations),
    3627             : #ifdef CONFIG_PROC_PAGE_MONITOR
    3628             :         REG("clear_refs", S_IWUSR, proc_clear_refs_operations),
    3629             :         REG("smaps",     S_IRUGO, proc_pid_smaps_operations),
    3630             :         REG("smaps_rollup", S_IRUGO, proc_pid_smaps_rollup_operations),
    3631             :         REG("pagemap",    S_IRUSR, proc_pagemap_operations),
    3632             : #endif
    3633             : #ifdef CONFIG_SECURITY
    3634             :         DIR("attr",      S_IRUGO|S_IXUGO, proc_attr_dir_inode_operations, proc_attr_dir_operations),
    3635             : #endif
    3636             : #ifdef CONFIG_KALLSYMS
    3637             :         ONE("wchan",     S_IRUGO, proc_pid_wchan),
    3638             : #endif
    3639             : #ifdef CONFIG_STACKTRACE
    3640             :         ONE("stack",      S_IRUSR, proc_pid_stack),
    3641             : #endif
    3642             : #ifdef CONFIG_SCHED_INFO
    3643             :         ONE("schedstat", S_IRUGO, proc_pid_schedstat),
    3644             : #endif
    3645             : #ifdef CONFIG_LATENCYTOP
    3646             :         REG("latency",  S_IRUGO, proc_lstats_operations),
    3647             : #endif
    3648             : #ifdef CONFIG_PROC_PID_CPUSET
    3649             :         ONE("cpuset",    S_IRUGO, proc_cpuset_show),
    3650             : #endif
    3651             : #ifdef CONFIG_CGROUPS
    3652             :         ONE("cgroup",  S_IRUGO, proc_cgroup_show),
    3653             : #endif
    3654             : #ifdef CONFIG_PROC_CPU_RESCTRL
    3655             :         ONE("cpu_resctrl_groups", S_IRUGO, proc_resctrl_show),
    3656             : #endif
    3657             :         ONE("oom_score", S_IRUGO, proc_oom_score),
    3658             :         REG("oom_adj",   S_IRUGO|S_IWUSR, proc_oom_adj_operations),
    3659             :         REG("oom_score_adj", S_IRUGO|S_IWUSR, proc_oom_score_adj_operations),
    3660             : #ifdef CONFIG_AUDIT
    3661             :         REG("loginuid",  S_IWUSR|S_IRUGO, proc_loginuid_operations),
    3662             :         REG("sessionid",  S_IRUGO, proc_sessionid_operations),
    3663             : #endif
    3664             : #ifdef CONFIG_FAULT_INJECTION
    3665             :         REG("make-it-fail", S_IRUGO|S_IWUSR, proc_fault_inject_operations),
    3666             :         REG("fail-nth", 0644, proc_fail_nth_operations),
    3667             : #endif
    3668             : #ifdef CONFIG_TASK_IO_ACCOUNTING
    3669             :         ONE("io",     S_IRUSR, proc_tid_io_accounting),
    3670             : #endif
    3671             : #ifdef CONFIG_USER_NS
    3672             :         REG("uid_map",    S_IRUGO|S_IWUSR, proc_uid_map_operations),
    3673             :         REG("gid_map",    S_IRUGO|S_IWUSR, proc_gid_map_operations),
    3674             :         REG("projid_map", S_IRUGO|S_IWUSR, proc_projid_map_operations),
    3675             :         REG("setgroups",  S_IRUGO|S_IWUSR, proc_setgroups_operations),
    3676             : #endif
    3677             : #ifdef CONFIG_LIVEPATCH
    3678             :         ONE("patch_state",  S_IRUSR, proc_pid_patch_state),
    3679             : #endif
    3680             : #ifdef CONFIG_PROC_PID_ARCH_STATUS
    3681             :         ONE("arch_status", S_IRUGO, proc_pid_arch_status),
    3682             : #endif
    3683             : #ifdef CONFIG_SECCOMP_CACHE_DEBUG
    3684             :         ONE("seccomp_cache", S_IRUSR, proc_pid_seccomp_cache),
    3685             : #endif
    3686             : #ifdef CONFIG_KSM
    3687             :         ONE("ksm_merging_pages",  S_IRUSR, proc_pid_ksm_merging_pages),
    3688             :         ONE("ksm_stat",  S_IRUSR, proc_pid_ksm_stat),
    3689             : #endif
    3690             : };
    3691             : 
    3692           0 : static int proc_tid_base_readdir(struct file *file, struct dir_context *ctx)
    3693             : {
    3694           0 :         return proc_pident_readdir(file, ctx,
    3695             :                                    tid_base_stuff, ARRAY_SIZE(tid_base_stuff));
    3696             : }
    3697             : 
    3698           0 : static struct dentry *proc_tid_base_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
    3699             : {
    3700           0 :         return proc_pident_lookup(dir, dentry,
    3701             :                                   tid_base_stuff,
    3702             :                                   tid_base_stuff + ARRAY_SIZE(tid_base_stuff));
    3703             : }
    3704             : 
    3705             : static const struct file_operations proc_tid_base_operations = {
    3706             :         .read           = generic_read_dir,
    3707             :         .iterate_shared = proc_tid_base_readdir,
    3708             :         .llseek         = generic_file_llseek,
    3709             : };
    3710             : 
    3711             : static const struct inode_operations proc_tid_base_inode_operations = {
    3712             :         .lookup         = proc_tid_base_lookup,
    3713             :         .getattr        = pid_getattr,
    3714             :         .setattr        = proc_setattr,
    3715             : };
    3716             : 
    3717           0 : static struct dentry *proc_task_instantiate(struct dentry *dentry,
    3718             :         struct task_struct *task, const void *ptr)
    3719             : {
    3720             :         struct inode *inode;
    3721           0 :         inode = proc_pid_make_base_inode(dentry->d_sb, task,
    3722             :                                          S_IFDIR | S_IRUGO | S_IXUGO);
    3723           0 :         if (!inode)
    3724             :                 return ERR_PTR(-ENOENT);
    3725             : 
    3726           0 :         inode->i_op = &proc_tid_base_inode_operations;
    3727           0 :         inode->i_fop = &proc_tid_base_operations;
    3728           0 :         inode->i_flags |= S_IMMUTABLE;
    3729             : 
    3730           0 :         set_nlink(inode, nlink_tid);
    3731           0 :         pid_update_inode(task, inode);
    3732             : 
    3733           0 :         d_set_d_op(dentry, &pid_dentry_operations);
    3734           0 :         return d_splice_alias(inode, dentry);
    3735             : }
    3736             : 
    3737           0 : static struct dentry *proc_task_lookup(struct inode *dir, struct dentry * dentry, unsigned int flags)
    3738             : {
    3739             :         struct task_struct *task;
    3740           0 :         struct task_struct *leader = get_proc_task(dir);
    3741             :         unsigned tid;
    3742             :         struct proc_fs_info *fs_info;
    3743             :         struct pid_namespace *ns;
    3744           0 :         struct dentry *result = ERR_PTR(-ENOENT);
    3745             : 
    3746           0 :         if (!leader)
    3747             :                 goto out_no_task;
    3748             : 
    3749           0 :         tid = name_to_int(&dentry->d_name);
    3750           0 :         if (tid == ~0U)
    3751             :                 goto out;
    3752             : 
    3753           0 :         fs_info = proc_sb_info(dentry->d_sb);
    3754           0 :         ns = fs_info->pid_ns;
    3755             :         rcu_read_lock();
    3756           0 :         task = find_task_by_pid_ns(tid, ns);
    3757           0 :         if (task)
    3758             :                 get_task_struct(task);
    3759             :         rcu_read_unlock();
    3760           0 :         if (!task)
    3761             :                 goto out;
    3762           0 :         if (!same_thread_group(leader, task))
    3763             :                 goto out_drop_task;
    3764             : 
    3765           0 :         result = proc_task_instantiate(dentry, task, NULL);
    3766             : out_drop_task:
    3767           0 :         put_task_struct(task);
    3768             : out:
    3769           0 :         put_task_struct(leader);
    3770             : out_no_task:
    3771           0 :         return result;
    3772             : }
    3773             : 
    3774             : /*
    3775             :  * Find the first tid of a thread group to return to user space.
    3776             :  *
    3777             :  * Usually this is just the thread group leader, but if the users
    3778             :  * buffer was too small or there was a seek into the middle of the
    3779             :  * directory we have more work todo.
    3780             :  *
    3781             :  * In the case of a short read we start with find_task_by_pid.
    3782             :  *
    3783             :  * In the case of a seek we start with the leader and walk nr
    3784             :  * threads past it.
    3785             :  */
    3786           0 : static struct task_struct *first_tid(struct pid *pid, int tid, loff_t f_pos,
    3787             :                                         struct pid_namespace *ns)
    3788             : {
    3789             :         struct task_struct *pos, *task;
    3790           0 :         unsigned long nr = f_pos;
    3791             : 
    3792             :         if (nr != f_pos)        /* 32bit overflow? */
    3793             :                 return NULL;
    3794             : 
    3795             :         rcu_read_lock();
    3796           0 :         task = pid_task(pid, PIDTYPE_PID);
    3797           0 :         if (!task)
    3798             :                 goto fail;
    3799             : 
    3800             :         /* Attempt to start with the tid of a thread */
    3801           0 :         if (tid && nr) {
    3802           0 :                 pos = find_task_by_pid_ns(tid, ns);
    3803           0 :                 if (pos && same_thread_group(pos, task))
    3804             :                         goto found;
    3805             :         }
    3806             : 
    3807             :         /* If nr exceeds the number of threads there is nothing todo */
    3808           0 :         if (nr >= get_nr_threads(task))
    3809             :                 goto fail;
    3810             : 
    3811             :         /* If we haven't found our starting place yet start
    3812             :          * with the leader and walk nr threads forward.
    3813             :          */
    3814           0 :         pos = task = task->group_leader;
    3815             :         do {
    3816           0 :                 if (!nr--)
    3817             :                         goto found;
    3818           0 :         } while_each_thread(task, pos);
    3819             : fail:
    3820             :         pos = NULL;
    3821             :         goto out;
    3822             : found:
    3823             :         get_task_struct(pos);
    3824             : out:
    3825             :         rcu_read_unlock();
    3826             :         return pos;
    3827             : }
    3828             : 
    3829             : /*
    3830             :  * Find the next thread in the thread list.
    3831             :  * Return NULL if there is an error or no next thread.
    3832             :  *
    3833             :  * The reference to the input task_struct is released.
    3834             :  */
    3835           0 : static struct task_struct *next_tid(struct task_struct *start)
    3836             : {
    3837           0 :         struct task_struct *pos = NULL;
    3838             :         rcu_read_lock();
    3839           0 :         if (pid_alive(start)) {
    3840           0 :                 pos = next_thread(start);
    3841           0 :                 if (thread_group_leader(pos))
    3842             :                         pos = NULL;
    3843             :                 else
    3844             :                         get_task_struct(pos);
    3845             :         }
    3846             :         rcu_read_unlock();
    3847           0 :         put_task_struct(start);
    3848           0 :         return pos;
    3849             : }
    3850             : 
    3851             : /* for the /proc/TGID/task/ directories */
    3852           0 : static int proc_task_readdir(struct file *file, struct dir_context *ctx)
    3853             : {
    3854           0 :         struct inode *inode = file_inode(file);
    3855             :         struct task_struct *task;
    3856             :         struct pid_namespace *ns;
    3857             :         int tid;
    3858             : 
    3859           0 :         if (proc_inode_is_dead(inode))
    3860             :                 return -ENOENT;
    3861             : 
    3862           0 :         if (!dir_emit_dots(file, ctx))
    3863             :                 return 0;
    3864             : 
    3865             :         /* f_version caches the tgid value that the last readdir call couldn't
    3866             :          * return. lseek aka telldir automagically resets f_version to 0.
    3867             :          */
    3868           0 :         ns = proc_pid_ns(inode->i_sb);
    3869           0 :         tid = (int)file->f_version;
    3870           0 :         file->f_version = 0;
    3871           0 :         for (task = first_tid(proc_pid(inode), tid, ctx->pos - 2, ns);
    3872             :              task;
    3873           0 :              task = next_tid(task), ctx->pos++) {
    3874             :                 char name[10 + 1];
    3875             :                 unsigned int len;
    3876             : 
    3877           0 :                 tid = task_pid_nr_ns(task, ns);
    3878           0 :                 if (!tid)
    3879           0 :                         continue;       /* The task has just exited. */
    3880           0 :                 len = snprintf(name, sizeof(name), "%u", tid);
    3881           0 :                 if (!proc_fill_cache(file, ctx, name, len,
    3882             :                                 proc_task_instantiate, task, NULL)) {
    3883             :                         /* returning this tgid failed, save it as the first
    3884             :                          * pid for the next readir call */
    3885           0 :                         file->f_version = (u64)tid;
    3886           0 :                         put_task_struct(task);
    3887           0 :                         break;
    3888             :                 }
    3889             :         }
    3890             : 
    3891             :         return 0;
    3892             : }
    3893             : 
    3894           0 : static int proc_task_getattr(struct mnt_idmap *idmap,
    3895             :                              const struct path *path, struct kstat *stat,
    3896             :                              u32 request_mask, unsigned int query_flags)
    3897             : {
    3898           0 :         struct inode *inode = d_inode(path->dentry);
    3899           0 :         struct task_struct *p = get_proc_task(inode);
    3900           0 :         generic_fillattr(&nop_mnt_idmap, inode, stat);
    3901             : 
    3902           0 :         if (p) {
    3903           0 :                 stat->nlink += get_nr_threads(p);
    3904           0 :                 put_task_struct(p);
    3905             :         }
    3906             : 
    3907           0 :         return 0;
    3908             : }
    3909             : 
    3910             : static const struct inode_operations proc_task_inode_operations = {
    3911             :         .lookup         = proc_task_lookup,
    3912             :         .getattr        = proc_task_getattr,
    3913             :         .setattr        = proc_setattr,
    3914             :         .permission     = proc_pid_permission,
    3915             : };
    3916             : 
    3917             : static const struct file_operations proc_task_operations = {
    3918             :         .read           = generic_read_dir,
    3919             :         .iterate_shared = proc_task_readdir,
    3920             :         .llseek         = generic_file_llseek,
    3921             : };
    3922             : 
    3923           1 : void __init set_proc_pid_nlink(void)
    3924             : {
    3925           1 :         nlink_tid = pid_entry_nlink(tid_base_stuff, ARRAY_SIZE(tid_base_stuff));
    3926           1 :         nlink_tgid = pid_entry_nlink(tgid_base_stuff, ARRAY_SIZE(tgid_base_stuff));
    3927           1 : }

Generated by: LCOV version 1.14