diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/exit.c | 2 | ||||
| -rw-r--r-- | kernel/lockdep.c | 17 | ||||
| -rw-r--r-- | kernel/pid_namespace.c | 3 | ||||
| -rw-r--r-- | kernel/time/tick-broadcast.c | 3 | ||||
| -rw-r--r-- | kernel/user.c | 2 | ||||
| -rw-r--r-- | kernel/user_namespace.c | 11 | 
6 files changed, 27 insertions, 11 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index 51e485ca993..60bc027c61c 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -835,7 +835,7 @@ void do_exit(long code)  	/*  	 * Make sure we are holding no locks:  	 */ -	debug_check_no_locks_held(); +	debug_check_no_locks_held(tsk);  	/*  	 * We can do this unlocked here. The futex code uses this flag  	 * just to verify whether the pi state cleanup has been done diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 259db207b5d..8a0efac4f99 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c @@ -4088,7 +4088,7 @@ void debug_check_no_locks_freed(const void *mem_from, unsigned long mem_len)  }  EXPORT_SYMBOL_GPL(debug_check_no_locks_freed); -static void print_held_locks_bug(void) +static void print_held_locks_bug(struct task_struct *curr)  {  	if (!debug_locks_off())  		return; @@ -4097,21 +4097,22 @@ static void print_held_locks_bug(void)  	printk("\n");  	printk("=====================================\n"); -	printk("[ BUG: %s/%d still has locks held! ]\n", -	       current->comm, task_pid_nr(current)); +	printk("[ BUG: lock held at task exit time! ]\n");  	print_kernel_ident();  	printk("-------------------------------------\n"); -	lockdep_print_held_locks(current); +	printk("%s/%d is exiting with locks still held!\n", +		curr->comm, task_pid_nr(curr)); +	lockdep_print_held_locks(curr); +  	printk("\nstack backtrace:\n");  	dump_stack();  } -void debug_check_no_locks_held(void) +void debug_check_no_locks_held(struct task_struct *task)  { -	if (unlikely(current->lockdep_depth > 0)) -		print_held_locks_bug(); +	if (unlikely(task->lockdep_depth > 0)) +		print_held_locks_bug(task);  } -EXPORT_SYMBOL_GPL(debug_check_no_locks_held);  void debug_show_all_locks(void)  { diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c index c1c3dc1c602..bea15bdf82b 100644 --- a/kernel/pid_namespace.c +++ b/kernel/pid_namespace.c @@ -181,6 +181,7 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns)  	int nr;  	int rc;  	struct task_struct *task, *me = current; +	int init_pids = thread_group_leader(me) ? 1 : 2;  	/* Don't allow any more processes into the pid namespace */  	disable_pid_allocation(pid_ns); @@ -230,7 +231,7 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns)  	 */  	for (;;) {  		set_current_state(TASK_UNINTERRUPTIBLE); -		if (pid_ns->nr_hashed == 1) +		if (pid_ns->nr_hashed == init_pids)  			break;  		schedule();  	} diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index 2fb8cb88df8..7f32fe0e52c 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c @@ -67,7 +67,8 @@ static void tick_broadcast_start_periodic(struct clock_event_device *bc)   */  int tick_check_broadcast_device(struct clock_event_device *dev)  { -	if ((tick_broadcast_device.evtdev && +	if ((dev->features & CLOCK_EVT_FEAT_DUMMY) || +	    (tick_broadcast_device.evtdev &&  	     tick_broadcast_device.evtdev->rating >= dev->rating) ||  	     (dev->features & CLOCK_EVT_FEAT_C3STOP))  		return 0; diff --git a/kernel/user.c b/kernel/user.c index e81978e8c03..8e635a18ab5 100644 --- a/kernel/user.c +++ b/kernel/user.c @@ -51,6 +51,8 @@ struct user_namespace init_user_ns = {  	.owner = GLOBAL_ROOT_UID,  	.group = GLOBAL_ROOT_GID,  	.proc_inum = PROC_USER_INIT_INO, +	.may_mount_sysfs = true, +	.may_mount_proc = true,  };  EXPORT_SYMBOL_GPL(init_user_ns); diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c index b14f4d34204..a54f26f82eb 100644 --- a/kernel/user_namespace.c +++ b/kernel/user_namespace.c @@ -61,6 +61,15 @@ int create_user_ns(struct cred *new)  	kgid_t group = new->egid;  	int ret; +	/* +	 * Verify that we can not violate the policy of which files +	 * may be accessed that is specified by the root directory, +	 * by verifing that the root directory is at the root of the +	 * mount namespace which allows all files to be accessed. +	 */ +	if (current_chrooted()) +		return -EPERM; +  	/* The creator needs a mapping in the parent user namespace  	 * or else we won't be able to reasonably tell userspace who  	 * created a user_namespace. @@ -87,6 +96,8 @@ int create_user_ns(struct cred *new)  	set_cred_user_ns(new, ns); +	update_mnt_policy(ns); +  	return 0;  }  |