|
@@ -202,7 +202,7 @@ copy_thread(int nr, unsigned long clone_flags,
|
|
|
* sys_execve() executes a new program.
|
|
|
*/
|
|
|
|
|
|
-asmlinkage int sys_execve(char *name, char **argv, char **envp)
|
|
|
+asmlinkage int sys_execve(char __user *name, char __user * __user *argv, char __user * __user *envp)
|
|
|
{
|
|
|
int error;
|
|
|
char *filename;
|
|
@@ -245,23 +245,25 @@ unsigned long get_wchan(struct task_struct *p)
|
|
|
|
|
|
void finish_atomic_sections (struct pt_regs *regs)
|
|
|
{
|
|
|
+ int __user *up0 = (int __user *)®s->p0;
|
|
|
+
|
|
|
if (regs->pc < ATOMIC_SEQS_START || regs->pc >= ATOMIC_SEQS_END)
|
|
|
return;
|
|
|
|
|
|
switch (regs->pc) {
|
|
|
case ATOMIC_XCHG32 + 2:
|
|
|
- put_user(regs->r1, (int *)regs->p0);
|
|
|
+ put_user(regs->r1, up0);
|
|
|
regs->pc += 2;
|
|
|
break;
|
|
|
|
|
|
case ATOMIC_CAS32 + 2:
|
|
|
case ATOMIC_CAS32 + 4:
|
|
|
if (regs->r0 == regs->r1)
|
|
|
- put_user(regs->r2, (int *)regs->p0);
|
|
|
+ put_user(regs->r2, up0);
|
|
|
regs->pc = ATOMIC_CAS32 + 8;
|
|
|
break;
|
|
|
case ATOMIC_CAS32 + 6:
|
|
|
- put_user(regs->r2, (int *)regs->p0);
|
|
|
+ put_user(regs->r2, up0);
|
|
|
regs->pc += 2;
|
|
|
break;
|
|
|
|
|
@@ -269,7 +271,7 @@ void finish_atomic_sections (struct pt_regs *regs)
|
|
|
regs->r0 = regs->r1 + regs->r0;
|
|
|
/* fall through */
|
|
|
case ATOMIC_ADD32 + 4:
|
|
|
- put_user(regs->r0, (int *)regs->p0);
|
|
|
+ put_user(regs->r0, up0);
|
|
|
regs->pc = ATOMIC_ADD32 + 6;
|
|
|
break;
|
|
|
|
|
@@ -277,7 +279,7 @@ void finish_atomic_sections (struct pt_regs *regs)
|
|
|
regs->r0 = regs->r1 - regs->r0;
|
|
|
/* fall through */
|
|
|
case ATOMIC_SUB32 + 4:
|
|
|
- put_user(regs->r0, (int *)regs->p0);
|
|
|
+ put_user(regs->r0, up0);
|
|
|
regs->pc = ATOMIC_SUB32 + 6;
|
|
|
break;
|
|
|
|
|
@@ -285,7 +287,7 @@ void finish_atomic_sections (struct pt_regs *regs)
|
|
|
regs->r0 = regs->r1 | regs->r0;
|
|
|
/* fall through */
|
|
|
case ATOMIC_IOR32 + 4:
|
|
|
- put_user(regs->r0, (int *)regs->p0);
|
|
|
+ put_user(regs->r0, up0);
|
|
|
regs->pc = ATOMIC_IOR32 + 6;
|
|
|
break;
|
|
|
|
|
@@ -293,7 +295,7 @@ void finish_atomic_sections (struct pt_regs *regs)
|
|
|
regs->r0 = regs->r1 & regs->r0;
|
|
|
/* fall through */
|
|
|
case ATOMIC_AND32 + 4:
|
|
|
- put_user(regs->r0, (int *)regs->p0);
|
|
|
+ put_user(regs->r0, up0);
|
|
|
regs->pc = ATOMIC_AND32 + 6;
|
|
|
break;
|
|
|
|
|
@@ -301,7 +303,7 @@ void finish_atomic_sections (struct pt_regs *regs)
|
|
|
regs->r0 = regs->r1 ^ regs->r0;
|
|
|
/* fall through */
|
|
|
case ATOMIC_XOR32 + 4:
|
|
|
- put_user(regs->r0, (int *)regs->p0);
|
|
|
+ put_user(regs->r0, up0);
|
|
|
regs->pc = ATOMIC_XOR32 + 6;
|
|
|
break;
|
|
|
}
|