Use EFAULT instead of EINVAL for bad user pointers
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 6 Mar 2013 21:19:13 +0000 (13:19 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 6 Mar 2013 21:19:13 +0000 (13:19 -0800)
And don't reset errno when using the memcpy errno helpers.

kern/src/syscall.c
kern/src/umem.c

index 44194bf..4cdc267 100644 (file)
@@ -1145,7 +1145,6 @@ static intreg_t sys_fstat(struct proc *p, int fd, struct kstat *u_stat)
        /* TODO: UMEM: pin the memory, copy directly, and skip the kernel buffer */
        if (memcpy_to_user_errno(p, u_stat, kbuf, sizeof(struct kstat))) {
                kfree(kbuf);
-               set_errno(EINVAL);
                return -1;
        }
        kfree(kbuf);
@@ -1178,7 +1177,6 @@ static intreg_t stat_helper(struct proc *p, const char *path, size_t path_l,
        /* TODO: UMEM: pin the memory, copy directly, and skip the kernel buffer */
        if (memcpy_to_user_errno(p, u_stat, kbuf, sizeof(struct kstat))) {
                kfree(kbuf);
-               set_errno(EINVAL);
                return -1;
        }
        kfree(kbuf);
@@ -1366,7 +1364,6 @@ intreg_t sys_readlink(struct proc *p, char *path, size_t path_l,
        copy_amt = strnlen(symname, buf_l - 1) + 1;
        if (memcpy_to_user_errno(p, u_buf, symname, copy_amt)) {
                kref_put(&path_d->d_kref);
-               set_errno(EINVAL);
                return -1;
        }
        kref_put(&path_d->d_kref);
index e2a776d..ed6bde3 100644 (file)
@@ -252,7 +252,7 @@ int memcpy_to_user(struct proc *p, void *va, const void *src, size_t len)
 int memcpy_to_user_errno(struct proc *p, void *dst, const void *src, int len)
 {
        if (memcpy_to_user(p, dst, src, len)) {
-               set_errno(EINVAL);
+               set_errno(EFAULT);
                return -1;
        }
        return 0;
@@ -268,7 +268,7 @@ void *user_memdup(struct proc *p, const void *va, int len)
                return ERR_PTR(-ENOMEM);
        if (memcpy_from_user(p, kva, va, len)) {
                kfree(kva);
-               return ERR_PTR(-EINVAL);
+               return ERR_PTR(-EFAULT);
        }
        return kva;
 }