--- zzzz-none-000/linux-2.6.19.2/kernel/fork.c 2007-01-10 19:10:37.000000000 +0000 +++ davinci-8020-5505/linux-2.6.19.2/kernel/fork.c 2007-01-19 14:42:56.000000000 +0000 @@ -48,6 +48,7 @@ #include #include #include +#include #include #include @@ -179,7 +180,7 @@ setup_thread_stack(tsk, orig); #ifdef CONFIG_CC_STACKPROTECTOR - tsk->stack_canary = get_random_int(); + tsk->stack_canary = pax_get_random_long(); #endif /* One for us, one for whoever does the "release_task()" (usually parent) */ @@ -211,8 +212,8 @@ mm->locked_vm = 0; mm->mmap = NULL; mm->mmap_cache = NULL; - mm->free_area_cache = oldmm->mmap_base; - mm->cached_hole_size = ~0UL; + mm->free_area_cache = oldmm->free_area_cache; + mm->cached_hole_size = oldmm->cached_hole_size; mm->map_count = 0; cpus_clear(mm->cpu_vm_mask); mm->mm_rb = RB_ROOT; @@ -337,7 +338,7 @@ spin_lock_init(&mm->page_table_lock); rwlock_init(&mm->ioctx_list_lock); mm->ioctx_list = NULL; - mm->free_area_cache = TASK_UNMAPPED_BASE; + mm->free_area_cache = ~0UL; mm->cached_hole_size = ~0UL; if (likely(!mm_alloc_pgd(mm))) { @@ -830,7 +831,7 @@ if (clone_flags & CLONE_THREAD) { atomic_inc(¤t->signal->count); atomic_inc(¤t->signal->live); - taskstats_tgid_alloc(current); + taskstats_tgid_alloc(current->signal); return 0; } sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL); @@ -897,6 +898,7 @@ void __cleanup_signal(struct signal_struct *sig) { exit_thread_group_keys(sig); + taskstats_tgid_free(sig); kmem_cache_free(signal_cachep, sig); } @@ -990,6 +992,9 @@ DEBUG_LOCKS_WARN_ON(!p->softirqs_enabled); #endif retval = -EAGAIN; + + gr_learn_resource(p, RLIMIT_NPROC, atomic_read(&p->user->processes), 0); + if (atomic_read(&p->user->processes) >= p->signal->rlim[RLIMIT_NPROC].rlim_cur) { if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) && @@ -1122,6 +1127,8 @@ if (retval) goto bad_fork_cleanup_namespaces; + gr_copy_label(p); + p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ? child_tidptr : NULL; /* * Clear TID on mm_release()? @@ -1300,6 +1307,8 @@ bad_fork_free: free_task(p); fork_out: + gr_log_forkfail(retval); + return ERR_PTR(retval); } @@ -1315,8 +1324,9 @@ struct pt_regs regs; task = copy_process(CLONE_VM, 0, idle_regs(®s), 0, NULL, NULL, 0); - if (!IS_ERR(task)) - init_idle(task, cpu); + if (!task) + return ERR_PTR(-ENOMEM); + init_idle(task, cpu); return task; } @@ -1372,6 +1382,8 @@ if (!IS_ERR(p)) { struct completion vfork; + gr_handle_brute_check(); + if (clone_flags & CLONE_VFORK) { p->vfork_done = &vfork; init_completion(&vfork);