[kernel] r8392 - in dists/etch/linux-2.6/debian: . patches/bugfix/all/vserver patches/series

Dann Frazier dannf at alioth.debian.org
Sun Mar 25 18:04:07 UTC 2007


Author: dannf
Date: Sun Mar 25 17:04:06 2007
New Revision: 8392

Added:
   dists/etch/linux-2.6/debian/patches/bugfix/all/vserver/
   dists/etch/linux-2.6/debian/patches/bugfix/all/vserver/cross-context-renice-fix.patch
Modified:
   dists/etch/linux-2.6/debian/changelog
   dists/etch/linux-2.6/debian/patches/series/12-extra
Log:
* bugfix/all/vserver/cross-context-renice-fix.patch
  [SECURITY] Fix a vulnerability that permits renicing processes in
  other contexts.
  See CVE-2007-0241

Modified: dists/etch/linux-2.6/debian/changelog
==============================================================================
--- dists/etch/linux-2.6/debian/changelog	(original)
+++ dists/etch/linux-2.6/debian/changelog	Sun Mar 25 17:04:06 2007
@@ -44,6 +44,10 @@
   * bugfix/bnx2_tx_avail-off-by-1-fix.patch
     Fix a panic in the bnx2 driver caused by an off-by-one error
     (closes: #410010)
+  * bugfix/all/vserver/cross-context-renice-fix.patch
+    [SECURITY] Fix a vulnerability that permits renicing processes in
+    other contexts.
+    See CVE-2007-0241
 
   [ Bastian Blank ]
   * xen: Fix highmem dma copy code. (closes: #415805)

Added: dists/etch/linux-2.6/debian/patches/bugfix/all/vserver/cross-context-renice-fix.patch
==============================================================================
--- (empty file)
+++ dists/etch/linux-2.6/debian/patches/bugfix/all/vserver/cross-context-renice-fix.patch	Sun Mar 25 17:04:06 2007
@@ -0,0 +1,101 @@
+diff -urN source-i386-vserver.orig/include/linux/pid.h source-i386-vserver/include/linux/pid.h
+--- source-i386-vserver.orig/include/linux/pid.h	2007-03-24 10:01:05.000000000 -0600
++++ source-i386-vserver/include/linux/pid.h	2007-03-24 10:35:23.000000000 -0600
+@@ -92,29 +92,39 @@
+ extern struct pid *alloc_pid(void);
+ extern void FASTCALL(free_pid(struct pid *pid));
+ 
+-#define pid_next(task, type)					\
+-	((task)->pids[(type)].node.next)
+-
+-#define pid_next_task(task, type) 				\
+-	hlist_entry(pid_next(task, type), struct task_struct,	\
+-			pids[(type)].node)
+-
+-
+-/* We could use hlist_for_each_entry_rcu here but it takes more arguments
+- * than the do_each_task_pid/while_each_task_pid.  So we roll our own
+- * to preserve the existing interface.
+- */
+-#define do_each_task_pid(who, type, task)				\
+-	if ((task = find_task_by_pid_type(type, who))) {		\
+-		prefetch(pid_next(task, type));				\
+-		do {
+-
+-#define while_each_task_pid(who, type, task)				\
+-		} while (pid_next(task, type) &&  ({			\
+-				task = pid_next_task(task, type);	\
+-				rcu_dereference(task);			\
+-				prefetch(pid_next(task, type));		\
+-				1; }) );				\
+-	}
++static inline pid_t pid_nr(struct pid *pid)
++{
++	pid_t nr = 0;
++	if (pid)
++		nr = pid->nr;
++	return nr;
++}
++
++
++#define do_each_task_pid(who, type, task)					\
++	do {									\
++		struct hlist_node *pos___;					\
++		struct pid *pid___ = find_pid(who);				\
++		if (pid___ != NULL)						\
++			hlist_for_each_entry_rcu((task), pos___,		\
++			&pid___->tasks[type], pids[type].node)	\
++		if (vx_check((task)->xid, VX_ADMIN|VX_IDENT)) {
++
++#define while_each_task_pid(who, type, task)					\
++			}							\
++	} while (0)
++
++
++#define do_each_pid_task(pid, type, task)					\
++	do {									\
++		struct hlist_node *pos___;					\
++		if (pid != NULL)						\
++			hlist_for_each_entry_rcu((task), pos___,		\
++			&pid->tasks[type], pids[type].node)	\
++		if (vx_check((task)->xid, VX_ADMIN|VX_IDENT)) {
++
++#define while_each_pid_task(pid, type, task)					\
++			}							\
++	} while (0)
+ 
+ #endif /* _LINUX_PID_H */
+diff -urN source-i386-vserver.orig/kernel/pid.c source-i386-vserver/kernel/pid.c
+--- source-i386-vserver.orig/kernel/pid.c	2007-03-24 10:01:05.000000000 -0600
++++ source-i386-vserver/kernel/pid.c	2007-03-24 10:26:32.000000000 -0600
+@@ -256,6 +256,9 @@
+ struct task_struct * fastcall pid_task(struct pid *pid, enum pid_type type)
+ {
+ 	struct task_struct *result = NULL;
++
++	if (type == PIDTYPE_REALPID)
++		type = PIDTYPE_PID;
+ 	if (pid) {
+ 		struct hlist_node *first;
+ 		first = rcu_dereference(pid->tasks[type].first);
+@@ -278,11 +281,17 @@
+  */
+ struct task_struct *find_task_by_pid_type(int type, int nr)
+ {
++	struct task_struct *task;
++
+ 	if (type == PIDTYPE_PID)
+ 		nr = vx_rmap_pid(nr);
+-	else if (type == PIDTYPE_REALPID)
+-		type = PIDTYPE_PID;
+-	return pid_task(find_pid(nr), type);
++
++	task = pid_task(find_pid(nr), type);
++	if (task && (type != PIDTYPE_REALPID) &&
++		/* maybe VX_WATCH_P in the future? */
++		!vx_check(task->xid, VX_WATCH|VX_IDENT))
++		return NULL;
++	return task;
+ }
+ 
+ EXPORT_SYMBOL(find_task_by_pid_type);

Modified: dists/etch/linux-2.6/debian/patches/series/12-extra
==============================================================================
--- dists/etch/linux-2.6/debian/patches/series/12-extra	(original)
+++ dists/etch/linux-2.6/debian/patches/series/12-extra	Sun Mar 25 17:04:06 2007
@@ -1 +1,2 @@
 + bugfix/all/xen/swiotlb-highmem-copy.patch *_xen *_xen-vserver
++ bugfix/all/vserver/cross-context-renice-fix.patch *_vserver *_xen-vserver



More information about the Kernel-svn-changes mailing list