busybox/examples/linux-2.6.30_proc_self_exe.patch
<<
>>
Prefs
   1This patch makes /proc/self/exe executable even if proc
   2is not mounted. It is especially useful on NOMMU arches.
   3
   4diff -urp ../linux-2.6.30.org/fs/exec.c linux-2.6.30/fs/exec.c
   5--- ../linux-2.6.30.org/fs/exec.c       2009-06-10 05:05:27.000000000 +0200
   6+++ linux-2.6.30/fs/exec.c      2009-06-25 00:20:13.000000000 +0200
   7@@ -652,9 +652,25 @@ struct file *open_exec(const char *name)
   8        file = do_filp_open(AT_FDCWD, name,
   9                                O_LARGEFILE | O_RDONLY | FMODE_EXEC, 0,
  10                                MAY_EXEC | MAY_OPEN);
  11-       if (IS_ERR(file))
  12-               goto out;
  13+       if (IS_ERR(file)) {
  14+               if ((PTR_ERR(file) == -ENOENT || PTR_ERR(file) == -EACCES)
  15+                && strcmp(name, "/proc/self/exe") == 0
  16+               ) {
  17+                       struct file *sv = file;
  18+                       struct mm_struct *mm;
  19 
  20+                       mm = get_task_mm(current);
  21+                       if (!mm)
  22+                               goto out;
  23+                       file = get_mm_exe_file(mm);
  24+                       mmput(mm);
  25+                       if (file)
  26+                               goto ok;
  27+                       file = sv;
  28+               }
  29+               goto out;
  30+       }
  31+ok:
  32        err = -EACCES;
  33        if (!S_ISREG(file->f_path.dentry->d_inode->i_mode))
  34                goto exit;
  35