linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC] c/r: prctl: Add ability to set new mm_struct::exe_file
@ 2012-02-29 15:16 Cyrill Gorcunov
  2012-02-29 15:23 ` Pavel Emelyanov
  2012-02-29 19:24 ` Oleg Nesterov
  0 siblings, 2 replies; 21+ messages in thread
From: Cyrill Gorcunov @ 2012-02-29 15:16 UTC (permalink / raw)
  To: LKML
  Cc: Andrew Morton, KOSAKI Motohiro, Pavel Emelyanov, Kees Cook,
	Tejun Heo, Oleg Nesterov

Hi guys,

at restore time we would like to have a way for /proc/pid/exe
symlink recovering. So I thought extending prctl might be
a good idea.

Still maybe there some other good and 'right' way to do it,
so I would like to gather opinions.

Please review, thanks!

	Cyrill
---
From: Cyrill Gorcunov <gorcunov@openvz.org>
Subject: [RFC] c/r: prctl: Add ability to set new mm_struct::exe_file

When we do restore we would like to have a way to setup
a former mm_struct::exe_file so that /proc/pid/exe would
point to the original executable file a process had at
checkpoint time.

For this sake PR_SET_MM_EXE_FILE code is introduced.

Note, if mm_struct::exe_file already mapped more than once
we refuse to change anything (which prevents kernel from
potential problems).

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
---
 include/linux/prctl.h |    1 
 kernel/sys.c          |   73 +++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 73 insertions(+), 1 deletion(-)

Index: linux-2.6.git/include/linux/prctl.h
===================================================================
--- linux-2.6.git.orig/include/linux/prctl.h
+++ linux-2.6.git/include/linux/prctl.h
@@ -118,5 +118,6 @@
 # define PR_SET_MM_ENV_START		10
 # define PR_SET_MM_ENV_END		11
 # define PR_SET_MM_AUXV			12
+# define PR_SET_MM_EXE_FILE		13
 
 #endif /* _LINUX_PRCTL_H */
Index: linux-2.6.git/kernel/sys.c
===================================================================
--- linux-2.6.git.orig/kernel/sys.c
+++ linux-2.6.git/kernel/sys.c
@@ -1701,6 +1701,66 @@ static bool vma_flags_mismatch(struct vm
 		(vma->vm_flags & banned);
 }
 
+/* Expects mm->mmap_sem is read-taken */
+static int prctl_set_mm_exe_file(struct mm_struct *mm,
+				 const void __user *path,
+				 size_t size)
+{
+	struct file *new_exe_file;
+	char *pathbuf;
+	int ret = 0;
+
+	if (size >= PATH_MAX)
+		return -EINVAL;
+
+	/*
+	 * We allow to change only those exe's which
+	 * are not mapped several times. This one
+	 * is early test while mmap_sem is taken.
+	 */
+	if (mm->num_exe_file_vmas > 1)
+		return -EBUSY;
+
+	up_read(&mm->mmap_sem);
+
+	pathbuf = kmalloc(size, GFP_TEMPORARY);
+	if (!pathbuf) {
+		ret = -ENOMEM;
+		goto err_down;
+	}
+
+	if (copy_from_user(pathbuf, path, size)) {
+		kfree(pathbuf);
+		ret = -EFAULT;
+		goto err_down;
+	}
+	pathbuf[size-1] = '\0';
+
+	new_exe_file = open_exec(pathbuf);
+	kfree(pathbuf);
+
+	down_read(&mm->mmap_sem);
+
+	if (IS_ERR(new_exe_file))
+		return PTR_ERR(new_exe_file);
+
+	/*
+	 * We allow to change only those exe's which
+	 * are not mapped several times.
+	 */
+	if (mm->num_exe_file_vmas < 2) {
+		set_mm_exe_file(mm, new_exe_file);
+		ret = 0;
+	} else
+		ret = -EBUSY;
+
+	return ret;
+
+err_down:
+	down_read(&mm->mmap_sem);
+	return ret;
+}
+
 static int prctl_set_mm(int opt, unsigned long addr,
 			unsigned long arg4, unsigned long arg5)
 {
@@ -1709,7 +1769,9 @@ static int prctl_set_mm(int opt, unsigne
 	struct vm_area_struct *vma;
 	int error = 0;
 
-	if (arg5 || (arg4 && opt != PR_SET_MM_AUXV))
+	if (arg5 || (arg4 &&
+		     opt != PR_SET_MM_AUXV &&
+		     opt != PR_SET_MM_EXE_FILE))
 		return -EINVAL;
 
 	if (!capable(CAP_SYS_ADMIN))
@@ -1837,6 +1899,15 @@ static int prctl_set_mm(int opt, unsigne
 
 		return 0;
 	}
+
+	/*
+	 * This to restore /proc/self/exe link.
+	 */
+	case PR_SET_MM_EXE_FILE:
+		error = prctl_set_mm_exe_file(mm, (const void __user *)addr, arg4);
+		if (error)
+			goto out;
+		break;
 	default:
 		error = -EINVAL;
 		goto out;

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2012-03-05 16:45 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-02-29 15:16 [RFC] c/r: prctl: Add ability to set new mm_struct::exe_file Cyrill Gorcunov
2012-02-29 15:23 ` Pavel Emelyanov
2012-02-29 15:31   ` Cyrill Gorcunov
2012-02-29 19:24 ` Oleg Nesterov
2012-02-29 20:01   ` Cyrill Gorcunov
2012-03-01 18:06     ` Oleg Nesterov
2012-03-01 19:17       ` Cyrill Gorcunov
2012-03-01 19:41         ` Oleg Nesterov
2012-03-01 20:00           ` Cyrill Gorcunov
2012-03-02 15:03             ` Oleg Nesterov
2012-03-02 14:26           ` Cyrill Gorcunov
2012-03-02 15:26             ` Oleg Nesterov
2012-03-02 16:12               ` Cyrill Gorcunov
2012-03-03 22:33                 ` Cyrill Gorcunov
2012-03-05 14:21                   ` Oleg Nesterov
2012-03-05 14:26                     ` Oleg Nesterov
2012-03-05 14:46                       ` Cyrill Gorcunov
2012-03-05 15:40                         ` Oleg Nesterov
2012-03-05 16:01                           ` Cyrill Gorcunov
2012-03-05 16:31                             ` Oleg Nesterov
2012-03-05 16:45                               ` Cyrill Gorcunov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).