diff options
Diffstat (limited to 'arch/um/kernel')
-rw-r--r-- | arch/um/kernel/exec_kern.c | 4 | ||||
-rw-r--r-- | arch/um/kernel/process_kern.c | 2 | ||||
-rw-r--r-- | arch/um/kernel/ptrace.c | 34 | ||||
-rw-r--r-- | arch/um/kernel/syscall_kern.c | 4 | ||||
-rw-r--r-- | arch/um/kernel/trap_kern.c | 8 |
5 files changed, 24 insertions, 28 deletions
diff --git a/arch/um/kernel/exec_kern.c b/arch/um/kernel/exec_kern.c index 1ca84319317d..f9b346e05b00 100644 --- a/arch/um/kernel/exec_kern.c +++ b/arch/um/kernel/exec_kern.c | |||
@@ -58,14 +58,14 @@ long um_execve(char *file, char __user *__user *argv, char __user *__user *env) | |||
58 | return(err); | 58 | return(err); |
59 | } | 59 | } |
60 | 60 | ||
61 | long sys_execve(char *file, char __user *__user *argv, | 61 | long sys_execve(char __user *file, char __user *__user *argv, |
62 | char __user *__user *env) | 62 | char __user *__user *env) |
63 | { | 63 | { |
64 | long error; | 64 | long error; |
65 | char *filename; | 65 | char *filename; |
66 | 66 | ||
67 | lock_kernel(); | 67 | lock_kernel(); |
68 | filename = getname((char __user *) file); | 68 | filename = getname(file); |
69 | error = PTR_ERR(filename); | 69 | error = PTR_ERR(filename); |
70 | if (IS_ERR(filename)) goto out; | 70 | if (IS_ERR(filename)) goto out; |
71 | error = execve1(filename, argv, env); | 71 | error = execve1(filename, argv, env); |
diff --git a/arch/um/kernel/process_kern.c b/arch/um/kernel/process_kern.c index 3113cab8675e..6922bdfb5ad5 100644 --- a/arch/um/kernel/process_kern.c +++ b/arch/um/kernel/process_kern.c | |||
@@ -407,7 +407,7 @@ static int proc_read_sysemu(char *buf, char **start, off_t offset, int size,int | |||
407 | return strlen(buf); | 407 | return strlen(buf); |
408 | } | 408 | } |
409 | 409 | ||
410 | static int proc_write_sysemu(struct file *file,const char *buf, unsigned long count,void *data) | 410 | static int proc_write_sysemu(struct file *file,const char __user *buf, unsigned long count,void *data) |
411 | { | 411 | { |
412 | char tmp[2]; | 412 | char tmp[2]; |
413 | 413 | ||
diff --git a/arch/um/kernel/ptrace.c b/arch/um/kernel/ptrace.c index 98e09395c093..394582202ce6 100644 --- a/arch/um/kernel/ptrace.c +++ b/arch/um/kernel/ptrace.c | |||
@@ -46,6 +46,7 @@ extern int poke_user(struct task_struct * child, long addr, long data); | |||
46 | long arch_ptrace(struct task_struct *child, long request, long addr, long data) | 46 | long arch_ptrace(struct task_struct *child, long request, long addr, long data) |
47 | { | 47 | { |
48 | int i, ret; | 48 | int i, ret; |
49 | unsigned long __user *p = (void __user *)(unsigned long)data; | ||
49 | 50 | ||
50 | switch (request) { | 51 | switch (request) { |
51 | /* when I and D space are separate, these will need to be fixed. */ | 52 | /* when I and D space are separate, these will need to be fixed. */ |
@@ -58,7 +59,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
58 | copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0); | 59 | copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0); |
59 | if (copied != sizeof(tmp)) | 60 | if (copied != sizeof(tmp)) |
60 | break; | 61 | break; |
61 | ret = put_user(tmp, (unsigned long __user *) data); | 62 | ret = put_user(tmp, p); |
62 | break; | 63 | break; |
63 | } | 64 | } |
64 | 65 | ||
@@ -136,15 +137,13 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
136 | 137 | ||
137 | #ifdef PTRACE_GETREGS | 138 | #ifdef PTRACE_GETREGS |
138 | case PTRACE_GETREGS: { /* Get all gp regs from the child. */ | 139 | case PTRACE_GETREGS: { /* Get all gp regs from the child. */ |
139 | if (!access_ok(VERIFY_WRITE, (unsigned long *)data, | 140 | if (!access_ok(VERIFY_WRITE, p, MAX_REG_OFFSET)) { |
140 | MAX_REG_OFFSET)) { | ||
141 | ret = -EIO; | 141 | ret = -EIO; |
142 | break; | 142 | break; |
143 | } | 143 | } |
144 | for ( i = 0; i < MAX_REG_OFFSET; i += sizeof(long) ) { | 144 | for ( i = 0; i < MAX_REG_OFFSET; i += sizeof(long) ) { |
145 | __put_user(getreg(child, i), | 145 | __put_user(getreg(child, i), p); |
146 | (unsigned long __user *) data); | 146 | p++; |
147 | data += sizeof(long); | ||
148 | } | 147 | } |
149 | ret = 0; | 148 | ret = 0; |
150 | break; | 149 | break; |
@@ -153,15 +152,14 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
153 | #ifdef PTRACE_SETREGS | 152 | #ifdef PTRACE_SETREGS |
154 | case PTRACE_SETREGS: { /* Set all gp regs in the child. */ | 153 | case PTRACE_SETREGS: { /* Set all gp regs in the child. */ |
155 | unsigned long tmp = 0; | 154 | unsigned long tmp = 0; |
156 | if (!access_ok(VERIFY_READ, (unsigned *)data, | 155 | if (!access_ok(VERIFY_READ, p, MAX_REG_OFFSET)) { |
157 | MAX_REG_OFFSET)) { | ||
158 | ret = -EIO; | 156 | ret = -EIO; |
159 | break; | 157 | break; |
160 | } | 158 | } |
161 | for ( i = 0; i < MAX_REG_OFFSET; i += sizeof(long) ) { | 159 | for ( i = 0; i < MAX_REG_OFFSET; i += sizeof(long) ) { |
162 | __get_user(tmp, (unsigned long __user *) data); | 160 | __get_user(tmp, p); |
163 | putreg(child, i, tmp); | 161 | putreg(child, i, tmp); |
164 | data += sizeof(long); | 162 | p++; |
165 | } | 163 | } |
166 | ret = 0; | 164 | ret = 0; |
167 | break; | 165 | break; |
@@ -188,13 +186,12 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
188 | break; | 186 | break; |
189 | #endif | 187 | #endif |
190 | case PTRACE_FAULTINFO: { | 188 | case PTRACE_FAULTINFO: { |
191 | /* Take the info from thread->arch->faultinfo, | 189 | /* Take the info from thread->arch->faultinfo, |
192 | * but transfer max. sizeof(struct ptrace_faultinfo). | 190 | * but transfer max. sizeof(struct ptrace_faultinfo). |
193 | * On i386, ptrace_faultinfo is smaller! | 191 | * On i386, ptrace_faultinfo is smaller! |
194 | */ | 192 | */ |
195 | ret = copy_to_user((unsigned long __user *) data, | 193 | ret = copy_to_user(p, &child->thread.arch.faultinfo, |
196 | &child->thread.arch.faultinfo, | 194 | sizeof(struct ptrace_faultinfo)); |
197 | sizeof(struct ptrace_faultinfo)); | ||
198 | if(ret) | 195 | if(ret) |
199 | break; | 196 | break; |
200 | break; | 197 | break; |
@@ -204,8 +201,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
204 | case PTRACE_LDT: { | 201 | case PTRACE_LDT: { |
205 | struct ptrace_ldt ldt; | 202 | struct ptrace_ldt ldt; |
206 | 203 | ||
207 | if(copy_from_user(&ldt, (unsigned long __user *) data, | 204 | if(copy_from_user(&ldt, p, sizeof(ldt))){ |
208 | sizeof(ldt))){ | ||
209 | ret = -EIO; | 205 | ret = -EIO; |
210 | break; | 206 | break; |
211 | } | 207 | } |
diff --git a/arch/um/kernel/syscall_kern.c b/arch/um/kernel/syscall_kern.c index 8e1a3501ff46..37d3978337d8 100644 --- a/arch/um/kernel/syscall_kern.c +++ b/arch/um/kernel/syscall_kern.c | |||
@@ -104,7 +104,7 @@ long sys_pipe(unsigned long __user * fildes) | |||
104 | } | 104 | } |
105 | 105 | ||
106 | 106 | ||
107 | long sys_uname(struct old_utsname * name) | 107 | long sys_uname(struct old_utsname __user * name) |
108 | { | 108 | { |
109 | long err; | 109 | long err; |
110 | if (!name) | 110 | if (!name) |
@@ -115,7 +115,7 @@ long sys_uname(struct old_utsname * name) | |||
115 | return err?-EFAULT:0; | 115 | return err?-EFAULT:0; |
116 | } | 116 | } |
117 | 117 | ||
118 | long sys_olduname(struct oldold_utsname * name) | 118 | long sys_olduname(struct oldold_utsname __user * name) |
119 | { | 119 | { |
120 | long error; | 120 | long error; |
121 | 121 | ||
diff --git a/arch/um/kernel/trap_kern.c b/arch/um/kernel/trap_kern.c index d56046c2aba2..02f6d4d8dc3a 100644 --- a/arch/um/kernel/trap_kern.c +++ b/arch/um/kernel/trap_kern.c | |||
@@ -198,7 +198,7 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, void *sc) | |||
198 | si.si_signo = SIGBUS; | 198 | si.si_signo = SIGBUS; |
199 | si.si_errno = 0; | 199 | si.si_errno = 0; |
200 | si.si_code = BUS_ADRERR; | 200 | si.si_code = BUS_ADRERR; |
201 | si.si_addr = (void *)address; | 201 | si.si_addr = (void __user *)address; |
202 | current->thread.arch.faultinfo = fi; | 202 | current->thread.arch.faultinfo = fi; |
203 | force_sig_info(SIGBUS, &si, current); | 203 | force_sig_info(SIGBUS, &si, current); |
204 | } else if (err == -ENOMEM) { | 204 | } else if (err == -ENOMEM) { |
@@ -207,7 +207,7 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, void *sc) | |||
207 | } else { | 207 | } else { |
208 | BUG_ON(err != -EFAULT); | 208 | BUG_ON(err != -EFAULT); |
209 | si.si_signo = SIGSEGV; | 209 | si.si_signo = SIGSEGV; |
210 | si.si_addr = (void *) address; | 210 | si.si_addr = (void __user *) address; |
211 | current->thread.arch.faultinfo = fi; | 211 | current->thread.arch.faultinfo = fi; |
212 | force_sig_info(SIGSEGV, &si, current); | 212 | force_sig_info(SIGSEGV, &si, current); |
213 | } | 213 | } |
@@ -220,8 +220,8 @@ void bad_segv(struct faultinfo fi, unsigned long ip) | |||
220 | 220 | ||
221 | si.si_signo = SIGSEGV; | 221 | si.si_signo = SIGSEGV; |
222 | si.si_code = SEGV_ACCERR; | 222 | si.si_code = SEGV_ACCERR; |
223 | si.si_addr = (void *) FAULT_ADDRESS(fi); | 223 | si.si_addr = (void __user *) FAULT_ADDRESS(fi); |
224 | current->thread.arch.faultinfo = fi; | 224 | current->thread.arch.faultinfo = fi; |
225 | force_sig_info(SIGSEGV, &si, current); | 225 | force_sig_info(SIGSEGV, &si, current); |
226 | } | 226 | } |
227 | 227 | ||