vserver 1.9.3
[linux-2.6.git] / arch / um / kernel / tt / uaccess_user.c
index 537ee9f..f014755 100644 (file)
@@ -8,15 +8,20 @@
 #include <string.h>
 #include "user_util.h"
 #include "uml_uaccess.h"
+#include "task.h"
+#include "kern_util.h"
 
 int __do_copy_from_user(void *to, const void *from, int n,
                        void **fault_addr, void **fault_catcher)
 {
+       struct tt_regs save = TASK_REGS(get_current())->tt;
        unsigned long fault;
        int faulted;
 
        fault = __do_user_copy(to, from, n, fault_addr, fault_catcher,
                               __do_copy, &faulted);
+       TASK_REGS(get_current())->tt = save;
+
        if(!faulted) return(0);
        else return(n - (fault - (unsigned long) from));
 }
@@ -29,11 +34,14 @@ static void __do_strncpy(void *dst, const void *src, int count)
 int __do_strncpy_from_user(char *dst, const char *src, unsigned long count,
                           void **fault_addr, void **fault_catcher)
 {
+       struct tt_regs save = TASK_REGS(get_current())->tt;
        unsigned long fault;
        int faulted;
 
        fault = __do_user_copy(dst, src, count, fault_addr, fault_catcher,
                               __do_strncpy, &faulted);
+       TASK_REGS(get_current())->tt = save;
+
        if(!faulted) return(strlen(dst));
        else return(-1);
 }
@@ -46,11 +54,14 @@ static void __do_clear(void *to, const void *from, int n)
 int __do_clear_user(void *mem, unsigned long len,
                    void **fault_addr, void **fault_catcher)
 {
+       struct tt_regs save = TASK_REGS(get_current())->tt;
        unsigned long fault;
        int faulted;
 
        fault = __do_user_copy(mem, NULL, len, fault_addr, fault_catcher,
                               __do_clear, &faulted);
+       TASK_REGS(get_current())->tt = save;
+
        if(!faulted) return(0);
        else return(len - (fault - (unsigned long) mem));
 }
@@ -58,19 +69,20 @@ int __do_clear_user(void *mem, unsigned long len,
 int __do_strnlen_user(const char *str, unsigned long n,
                      void **fault_addr, void **fault_catcher)
 {
+       struct tt_regs save = TASK_REGS(get_current())->tt;
        int ret;
        unsigned long *faddrp = (unsigned long *)fault_addr;
-       jmp_buf jbuf;
+       sigjmp_buf jbuf;
 
        *fault_catcher = &jbuf;
-       if(setjmp(jbuf) == 0){
+       if(sigsetjmp(jbuf, 1) == 0)
                ret = strlen(str) + 1;
-       } 
-       else {
-               ret = *faddrp - (unsigned long) str;
-       }
+       else ret = *faddrp - (unsigned long) str;
+
        *fault_addr = NULL;
        *fault_catcher = NULL;
+
+       TASK_REGS(get_current())->tt = save;
        return ret;
 }