Commit 7953a508 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] copy_process return value fix

Rather than assuming that all the things which copy_process() calls want to
return -ENOMEM, correctly propagate the return values.

This turns out to be a no-op at present.
parent 7a2a7655
...@@ -379,7 +379,6 @@ static struct mm_struct * mm_init(struct mm_struct * mm) ...@@ -379,7 +379,6 @@ static struct mm_struct * mm_init(struct mm_struct * mm)
free_mm(mm); free_mm(mm);
return NULL; return NULL;
} }
/* /*
* Allocate and initialize an mm_struct. * Allocate and initialize an mm_struct.
...@@ -543,7 +542,7 @@ static inline struct fs_struct *__copy_fs_struct(struct fs_struct *old) ...@@ -543,7 +542,7 @@ static inline struct fs_struct *__copy_fs_struct(struct fs_struct *old)
} else { } else {
fs->altrootmnt = NULL; fs->altrootmnt = NULL;
fs->altroot = NULL; fs->altroot = NULL;
} }
read_unlock(&old->lock); read_unlock(&old->lock);
} }
return fs; return fs;
...@@ -562,14 +561,14 @@ static inline int copy_fs(unsigned long clone_flags, struct task_struct * tsk) ...@@ -562,14 +561,14 @@ static inline int copy_fs(unsigned long clone_flags, struct task_struct * tsk)
} }
tsk->fs = __copy_fs_struct(current->fs); tsk->fs = __copy_fs_struct(current->fs);
if (!tsk->fs) if (!tsk->fs)
return -1; return -ENOMEM;
return 0; return 0;
} }
static int count_open_files(struct files_struct *files, int size) static int count_open_files(struct files_struct *files, int size)
{ {
int i; int i;
/* Find the last open fd */ /* Find the last open fd */
for (i = size/(8*sizeof(long)); i > 0; ) { for (i = size/(8*sizeof(long)); i > 0; ) {
if (files->open_fds->fds_bits[--i]) if (files->open_fds->fds_bits[--i])
...@@ -669,7 +668,7 @@ static int copy_files(unsigned long clone_flags, struct task_struct * tsk) ...@@ -669,7 +668,7 @@ static int copy_files(unsigned long clone_flags, struct task_struct * tsk)
if (newf->max_fdset > open_files) { if (newf->max_fdset > open_files) {
int left = (newf->max_fdset-open_files)/8; int left = (newf->max_fdset-open_files)/8;
int start = open_files / (8 * sizeof(unsigned long)); int start = open_files / (8 * sizeof(unsigned long));
memset(&newf->open_fds->fds_bits[start], 0, left); memset(&newf->open_fds->fds_bits[start], 0, left);
memset(&newf->close_on_exec->fds_bits[start], 0, left); memset(&newf->close_on_exec->fds_bits[start], 0, left);
} }
...@@ -697,7 +696,7 @@ static inline int copy_sighand(unsigned long clone_flags, struct task_struct * t ...@@ -697,7 +696,7 @@ static inline int copy_sighand(unsigned long clone_flags, struct task_struct * t
sig = kmem_cache_alloc(sighand_cachep, GFP_KERNEL); sig = kmem_cache_alloc(sighand_cachep, GFP_KERNEL);
tsk->sighand = sig; tsk->sighand = sig;
if (!sig) if (!sig)
return -1; return -ENOMEM;
spin_lock_init(&sig->siglock); spin_lock_init(&sig->siglock);
atomic_set(&sig->count, 1); atomic_set(&sig->count, 1);
memcpy(sig->action, current->sighand->action, sizeof(sig->action)); memcpy(sig->action, current->sighand->action, sizeof(sig->action));
...@@ -715,7 +714,7 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts ...@@ -715,7 +714,7 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts
sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL); sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL);
tsk->signal = sig; tsk->signal = sig;
if (!sig) if (!sig)
return -1; return -ENOMEM;
atomic_set(&sig->count, 1); atomic_set(&sig->count, 1);
sig->group_exit = 0; sig->group_exit = 0;
sig->group_exit_code = 0; sig->group_exit_code = 0;
...@@ -800,7 +799,7 @@ static struct task_struct *copy_process(unsigned long clone_flags, ...@@ -800,7 +799,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,
*/ */
if (nr_threads >= max_threads) if (nr_threads >= max_threads)
goto bad_fork_cleanup_count; goto bad_fork_cleanup_count;
if (!try_module_get(p->thread_info->exec_domain->module)) if (!try_module_get(p->thread_info->exec_domain->module))
goto bad_fork_cleanup_count; goto bad_fork_cleanup_count;
...@@ -860,23 +859,22 @@ static struct task_struct *copy_process(unsigned long clone_flags, ...@@ -860,23 +859,22 @@ static struct task_struct *copy_process(unsigned long clone_flags,
p->security = NULL; p->security = NULL;
retval = -ENOMEM; retval = -ENOMEM;
if (security_task_alloc(p)) if ((retval = security_task_alloc(p)))
goto bad_fork_cleanup; goto bad_fork_cleanup;
/* copy all the process information */ /* copy all the process information */
if (copy_semundo(clone_flags, p)) if ((retval = copy_semundo(clone_flags, p)))
goto bad_fork_cleanup_security; goto bad_fork_cleanup_security;
if (copy_files(clone_flags, p)) if ((retval = copy_files(clone_flags, p)))
goto bad_fork_cleanup_semundo; goto bad_fork_cleanup_semundo;
if (copy_fs(clone_flags, p)) if ((retval = copy_fs(clone_flags, p)))
goto bad_fork_cleanup_files; goto bad_fork_cleanup_files;
if (copy_sighand(clone_flags, p)) if ((retval = copy_sighand(clone_flags, p)))
goto bad_fork_cleanup_fs; goto bad_fork_cleanup_fs;
if (copy_signal(clone_flags, p)) if ((retval = copy_signal(clone_flags, p)))
goto bad_fork_cleanup_sighand; goto bad_fork_cleanup_sighand;
if (copy_mm(clone_flags, p)) if ((retval = copy_mm(clone_flags, p)))
goto bad_fork_cleanup_signal; goto bad_fork_cleanup_signal;
retval = copy_namespace(clone_flags, p); if ((retval = copy_namespace(clone_flags, p)))
if (retval)
goto bad_fork_cleanup_mm; goto bad_fork_cleanup_mm;
retval = copy_thread(0, clone_flags, stack_start, stack_size, p, regs); retval = copy_thread(0, clone_flags, stack_start, stack_size, p, regs);
if (retval) if (retval)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment