exec.c (11e4afb49b7fa1fc8e1ffd850c1806dd86a08204) exec.c (c7887325230aec47d47a32562a6e26014a0fafca)
1/*
2 * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
3 * Licensed under the GPL
4 */
5
6#include "linux/stddef.h"
7#include "linux/fs.h"
8#include "linux/smp_lock.h"

--- 30 unchanged lines hidden (view full) ---

39
40void start_thread(struct pt_regs *regs, unsigned long eip, unsigned long esp)
41{
42 set_fs(USER_DS);
43 PT_REGS_IP(regs) = eip;
44 PT_REGS_SP(regs) = esp;
45}
46
1/*
2 * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
3 * Licensed under the GPL
4 */
5
6#include "linux/stddef.h"
7#include "linux/fs.h"
8#include "linux/smp_lock.h"

--- 30 unchanged lines hidden (view full) ---

39
40void start_thread(struct pt_regs *regs, unsigned long eip, unsigned long esp)
41{
42 set_fs(USER_DS);
43 PT_REGS_IP(regs) = eip;
44 PT_REGS_SP(regs) = esp;
45}
46
47static long execve1(char *file, char __user * __user *argv,
47static long execve1(const char *file, char __user * __user *argv,
48 char __user *__user *env)
49{
50 long error;
51
52 error = do_execve(file, argv, env, &current->thread.regs);
53 if (error == 0) {
54 task_lock(current);
55 current->ptrace &= ~PT_DTRACE;
56#ifdef SUBARCH_EXECVE1
57 SUBARCH_EXECVE1(&current->thread.regs.regs);
58#endif
59 task_unlock(current);
60 }
61 return error;
62}
63
48 char __user *__user *env)
49{
50 long error;
51
52 error = do_execve(file, argv, env, &current->thread.regs);
53 if (error == 0) {
54 task_lock(current);
55 current->ptrace &= ~PT_DTRACE;
56#ifdef SUBARCH_EXECVE1
57 SUBARCH_EXECVE1(&current->thread.regs.regs);
58#endif
59 task_unlock(current);
60 }
61 return error;
62}
63
64long um_execve(char *file, char __user *__user *argv, char __user *__user *env)
64long um_execve(const char *file, char __user *__user *argv, char __user *__user *env)
65{
66 long err;
67
68 err = execve1(file, argv, env);
69 if (!err)
70 UML_LONGJMP(current->thread.exec_buf, 1);
71 return err;
72}
73
65{
66 long err;
67
68 err = execve1(file, argv, env);
69 if (!err)
70 UML_LONGJMP(current->thread.exec_buf, 1);
71 return err;
72}
73
74long sys_execve(char __user *file, char __user *__user *argv,
74long sys_execve(const char __user *file, char __user *__user *argv,
75 char __user *__user *env)
76{
77 long error;
78 char *filename;
79
80 lock_kernel();
81 filename = getname(file);
82 error = PTR_ERR(filename);
83 if (IS_ERR(filename)) goto out;
84 error = execve1(filename, argv, env);
85 putname(filename);
86 out:
87 unlock_kernel();
88 return error;
89}
75 char __user *__user *env)
76{
77 long error;
78 char *filename;
79
80 lock_kernel();
81 filename = getname(file);
82 error = PTR_ERR(filename);
83 if (IS_ERR(filename)) goto out;
84 error = execve1(filename, argv, env);
85 putname(filename);
86 out:
87 unlock_kernel();
88 return error;
89}