diff --git a/kernel-src/sys/syscalls/read.c b/kernel-src/sys/syscalls/read.c index 9fb1c00b..376f36ff 100644 --- a/kernel-src/sys/syscalls/read.c +++ b/kernel-src/sys/syscalls/read.c @@ -10,10 +10,8 @@ syscallret_t syscall_read(context_t *context, int fd, void *buffer, size_t size) .ret = -1 }; - void *kernelbuff = vmm_map(NULL, size == 0 ? 1 : size, VMM_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, NULL); - if (kernelbuff == NULL) { - printf("read enomem: %d %p %lu\n", fd, buffer, size); - ret.errno = ENOMEM; + if (IS_USER_ADDRESS(buffer) == false) { + ret.errno = EFAULT; return ret; } @@ -32,18 +30,16 @@ syscallret_t syscall_read(context_t *context, int fd, void *buffer, size_t size) size_t bytesread; uintmax_t offset = file->offset; - ret.errno = vfs_read(file->vnode, kernelbuff, size, file->offset, &bytesread, fileflagstovnodeflags(file->flags)); + ret.errno = vfs_read(file->vnode, buffer, size, file->offset, &bytesread, fileflagstovnodeflags(file->flags)); if (ret.errno) goto cleanup; file->offset = offset + bytesread; - ret.errno = usercopy_touser(buffer, kernelbuff, bytesread); - ret.ret = ret.errno ? -1 : bytesread; + ret.ret = bytesread; cleanup: if (file) fd_release(file); - vmm_unmap(kernelbuff, size == 0 ? 1 : size, 0); return ret; } diff --git a/kernel-src/sys/syscalls/write.c b/kernel-src/sys/syscalls/write.c index ff38d37b..bc5704dd 100644 --- a/kernel-src/sys/syscalls/write.c +++ b/kernel-src/sys/syscalls/write.c @@ -8,9 +8,8 @@ syscallret_t syscall_write(context_t *context, int fd, void *buffer, size_t size .ret = -1 }; - void *kernelbuff = vmm_map(NULL, size == 0 ? 1 : size, VMM_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, NULL); - if (kernelbuff == NULL) { - ret.errno = ENOMEM; + if (IS_USER_ADDRESS(buffer) == false) { + ret.errno = EFAULT; return ret; } @@ -21,10 +20,6 @@ syscallret_t syscall_write(context_t *context, int fd, void *buffer, size_t size goto cleanup; } - ret.errno = usercopy_fromuser(kernelbuff, buffer, size); - if (ret.errno) - goto cleanup; - if (size == 0) { ret.ret = 0; ret.errno = 0; @@ -46,7 +41,7 @@ syscallret_t syscall_write(context_t *context, int fd, void *buffer, size_t size offset = attr.size; } - ret.errno = vfs_write(file->vnode, kernelbuff, size, offset, &byteswritten, fileflagstovnodeflags(file->flags)); + ret.errno = vfs_write(file->vnode, buffer, size, offset, &byteswritten, fileflagstovnodeflags(file->flags)); if (ret.errno) goto cleanup; @@ -58,6 +53,5 @@ cleanup: if (file) fd_release(file); - vmm_unmap(kernelbuff, size == 0 ? 1 : size, 0); return ret; }