rpms/kernel/devel linux-2.6-proc-self-maps-fix.patch, NONE, 1.1 kernel-2.6.spec, 1.2125, 1.2126

fedora-cvs-commits at redhat.com fedora-cvs-commits at redhat.com
Mon Apr 10 19:21:21 UTC 2006


Author: davej

Update of /cvs/dist/rpms/kernel/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv21780

Modified Files:
	kernel-2.6.spec 
Added Files:
	linux-2.6-proc-self-maps-fix.patch 
Log Message:
Al's /proc/self/maps setuid fix


linux-2.6-proc-self-maps-fix.patch:
 fs/proc/base.c          |   20 ++++++++++++++++++++
 fs/proc/internal.h      |    2 ++
 fs/proc/task_mmu.c      |    3 +--
 include/linux/proc_fs.h |    0 
 include/linux/ptrace.h  |    1 +
 kernel/ptrace.c         |    4 ++--
 6 files changed, 26 insertions(+), 4 deletions(-)

--- NEW FILE linux-2.6-proc-self-maps-fix.patch ---

https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=165351

diff --git a/fs/proc/base.c b/fs/proc/base.c
index a3a3eec..3f262cd 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -408,6 +408,26 @@ static int proc_task_root_link(struct in
 	 (task->state == TASK_STOPPED || task->state == TASK_TRACED) && \
 	 security_ptrace(current,task) == 0))
 
+struct mm_struct *mm_for_maps(struct task_struct *task)
+{
+	struct mm_struct *mm = get_task_mm(task);
+	if (!mm)
+		return NULL;
+	down_read(&mm->mmap_sem);
+	task_lock(task);
+	if (task->mm != mm)
+		goto out;
+	if (task->mm != current->mm && !__ptrace_may_attach(task))
+		goto out;
+	task_unlock(task);
+	return mm;
+out:
+	task_unlock(task);
+	up_read(&mm->mmap_sem);
+	mmput(mm);
+	return NULL;
+}
+
 static int proc_pid_environ(struct task_struct *task, char * buffer)
 {
 	int res = 0;
diff --git a/fs/proc/internal.h b/fs/proc/internal.h
index 0502f17..cd172ce 100644
--- a/fs/proc/internal.h
+++ b/fs/proc/internal.h
@@ -16,6 +16,8 @@ struct vmalloc_info {
 	unsigned long	largest_chunk;
 };
 
+extern struct mm_struct *mm_for_maps(struct task_struct *);
+
 #ifdef CONFIG_MMU
 #define VMALLOC_TOTAL (VMALLOC_END - VMALLOC_START)
 extern void get_vmalloc_info(struct vmalloc_info *vmi);
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index 91b7c15..3777557 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -311,12 +311,11 @@ static void *m_start(struct seq_file *m,
 	if (last_addr == -1UL)
 		return NULL;
 
-	mm = get_task_mm(task);
+	mm = mm_for_maps(task);
 	if (!mm)
 		return NULL;
 
 	tail_vma = get_gate_vma(task);
-	down_read(&mm->mmap_sem);
 
 	/* Start with last addr hint */
 	if (last_addr && (vma = find_vma(mm, last_addr))) {
diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h
diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h
index 0d36750..578c28e 100644
--- a/include/linux/ptrace.h
+++ b/include/linux/ptrace.h
@@ -94,6 +94,7 @@ extern void __ptrace_link(struct task_st
 extern void __ptrace_unlink(struct task_struct *child);
 extern void ptrace_untrace(struct task_struct *child);
 extern int ptrace_may_attach(struct task_struct *task);
+extern int __ptrace_may_attach(struct task_struct *task);
 
 static inline void ptrace_link(struct task_struct *child,
 			       struct task_struct *new_parent)
diff --git a/kernel/ptrace.c b/kernel/ptrace.c
index 0eeb7e6..443f77e 100644
--- a/kernel/ptrace.c
+++ b/kernel/ptrace.c
@@ -121,7 +121,7 @@ int ptrace_check_attach(struct task_stru
 	return ret;
 }
 
-static int may_attach(struct task_struct *task)
+int __ptrace_may_attach(struct task_struct *task)
 {
 	if (!task->mm)
 		return -EPERM;
@@ -143,7 +143,7 @@ int ptrace_may_attach(struct task_struct
 {
 	int err;
 	task_lock(task);
-	err = may_attach(task);
+	err = __ptrace_may_attach(task);
 	task_unlock(task);
 	return !err;
 }



Index: kernel-2.6.spec
===================================================================
RCS file: /cvs/dist/rpms/kernel/devel/kernel-2.6.spec,v
retrieving revision 1.2125
retrieving revision 1.2126
diff -u -r1.2125 -r1.2126
--- kernel-2.6.spec	10 Apr 2006 19:18:17 -0000	1.2125
+++ kernel-2.6.spec	10 Apr 2006 19:21:19 -0000	1.2126
@@ -340,6 +340,7 @@
 Patch1690: linux-2.6-smsc-ircc2-pnp.patch
 Patch1700: linux-2.6-w1-hush-debug.patch
 Patch1710: linux-2.6-sched-up-migration-cost.patch
+Patch1720: linux-2.6-proc-self-maps-fix.patch
 Patch1740: linux-2.6-softlockup-disable.patch
 Patch1760: linux-2.6-suspend-slab-warnings.patch
 Patch1770: linux-2.6-optimise-spinlock-debug.patch
@@ -960,6 +961,8 @@
 %patch1700 -p1
 # Only print migration info on SMP
 %patch1710 -p1
+# setuid /proc/self/maps fix.
+%patch1720 -p1
 # Add a safety net to softlockup so that it doesn't prevent installs.
 %patch1740 -p1
 # Fix up kmalloc whilst atomic warning during resume.
@@ -1653,6 +1656,7 @@
 - 2.6.16rc1-git2
 - Enable SMP on all x86 kernels.
   SMP_ALTERNATIVES disables the spinlocks etc at runtime.
+- setuid /proc/self/maps fix (#165351)
 
 * Thu Apr  6 2006 Dave Jones <davej at redhat.com>
 - Rebuild without a zillion warnings.




More information about the fedora-cvs-commits mailing list