From 0ac60d68ea2bcdf1925b6368a16026e508e97f45 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Sat, 11 Jan 2014 23:07:45 +0100 Subject: [PATCH] Add function for clearing user-space memory from the kernel. --- kernel/copy.cpp | 13 ++++++++++++- kernel/fs/full.cpp | 16 +++------------- kernel/fs/zero.cpp | 16 +++------------- kernel/include/sortix/kernel/copy.h | 4 +++- kernel/include/sortix/kernel/ioctx.h | 3 ++- kernel/ioctx.cpp | 4 +++- 6 files changed, 26 insertions(+), 30 deletions(-) diff --git a/kernel/copy.cpp b/kernel/copy.cpp index a5d9226e..3f38b9d2 100644 --- a/kernel/copy.cpp +++ b/kernel/copy.cpp @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2012. + Copyright(C) Jonas 'Sortie' Termansen 2012, 2014. This file is part of Sortix. @@ -57,6 +57,17 @@ bool CopyFromKernel(void* kdst, const void* ksrc, size_t count) return true; } +bool ZeroKernel(void* kdst, size_t count) +{ + memset(kdst, 0, count); + return true; +} + +bool ZeroUser(void* userdst, size_t count) +{ + return ZeroKernel(userdst, count); +} + char* GetStringFromUser(const char* str) { return String::Clone(str); diff --git a/kernel/fs/full.cpp b/kernel/fs/full.cpp index 15b6ec83..5b04af70 100644 --- a/kernel/fs/full.cpp +++ b/kernel/fs/full.cpp @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2013. + Copyright(C) Jonas 'Sortie' Termansen 2013, 2014. This file is part of Sortix. @@ -70,18 +70,8 @@ off_t Full::lseek(ioctx_t* /*ctx*/, off_t offset, int /*whence*/) ssize_t Full::read(ioctx_t* ctx, uint8_t* buf, size_t count) { - const size_t ZERO_MEM_SIZE = 128; - uint8_t zero_mem[ZERO_MEM_SIZE]; - memset(zero_mem, 0, ZERO_MEM_SIZE); - size_t sofar = 0; - while ( sofar < count ) - { - size_t left = count - sofar; - size_t amount = left < ZERO_MEM_SIZE ? left : ZERO_MEM_SIZE; - ctx->copy_to_dest(buf + sofar, zero_mem, amount); - sofar += amount; - } - return (ssize_t) sofar; + ctx->zero_dest(buf, count); + return (ssize_t) count; } ssize_t Full::pread(ioctx_t* ctx, uint8_t* buf, size_t count, off_t /*off*/) diff --git a/kernel/fs/zero.cpp b/kernel/fs/zero.cpp index a50435cf..0bedca62 100644 --- a/kernel/fs/zero.cpp +++ b/kernel/fs/zero.cpp @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2013. + Copyright(C) Jonas 'Sortie' Termansen 2013, 2014. This file is part of Sortix. @@ -69,18 +69,8 @@ off_t Zero::lseek(ioctx_t* /*ctx*/, off_t offset, int /*whence*/) ssize_t Zero::read(ioctx_t* ctx, uint8_t* buf, size_t count) { - const size_t ZERO_MEM_SIZE = 128; - uint8_t zero_mem[ZERO_MEM_SIZE]; - memset(zero_mem, 0, ZERO_MEM_SIZE); - size_t sofar = 0; - while ( sofar < count ) - { - size_t left = count - sofar; - size_t amount = left < ZERO_MEM_SIZE ? left : ZERO_MEM_SIZE; - ctx->copy_to_dest(buf + sofar, zero_mem, amount); - sofar += amount; - } - return (ssize_t) sofar; + ctx->zero_dest(buf, count); + return (ssize_t) count; } ssize_t Zero::pread(ioctx_t* ctx, uint8_t* buf, size_t count, off_t /*off*/) diff --git a/kernel/include/sortix/kernel/copy.h b/kernel/include/sortix/kernel/copy.h index 6e6bbfbe..53eb2560 100644 --- a/kernel/include/sortix/kernel/copy.h +++ b/kernel/include/sortix/kernel/copy.h @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2012. + Copyright(C) Jonas 'Sortie' Termansen 2012, 2014. This file is part of Sortix. @@ -33,6 +33,8 @@ bool CopyToUser(void* userdst, const void* ksrc, size_t count); bool CopyFromUser(void* kdst, const void* usersrc, size_t count); bool CopyToKernel(void* kdst, const void* ksrc, size_t count); bool CopyFromKernel(void* kdst, const void* ksrc, size_t count); +bool ZeroKernel(void* kdst, size_t count); +bool ZeroUser(void* userdst, size_t count); char* GetStringFromUser(const char* str); } // namespace Sortix diff --git a/kernel/include/sortix/kernel/ioctx.h b/kernel/include/sortix/kernel/ioctx.h index 45fc160a..a20594d8 100644 --- a/kernel/include/sortix/kernel/ioctx.h +++ b/kernel/include/sortix/kernel/ioctx.h @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2012. + Copyright(C) Jonas 'Sortie' Termansen 2012, 2014. This file is part of Sortix. @@ -37,6 +37,7 @@ struct ioctx_struct gid_t gid, auth_gid; bool (*copy_to_dest)(void* dest, const void* src, size_t n); bool (*copy_from_src)(void* dest, const void* src, size_t n); + bool (*zero_dest)(void* dest, size_t n); int dflags; }; diff --git a/kernel/ioctx.cpp b/kernel/ioctx.cpp index cfbe4c60..c11a87b4 100644 --- a/kernel/ioctx.cpp +++ b/kernel/ioctx.cpp @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2012, 2013. + Copyright(C) Jonas 'Sortie' Termansen 2012, 2013, 2014. This file is part of Sortix. @@ -37,6 +37,7 @@ void SetupUserIOCtx(ioctx_t* ctx) ctx->gid = ctx->auth_gid = process->gid; ctx->copy_to_dest = CopyToUser; ctx->copy_from_src = CopyFromUser; + ctx->zero_dest = ZeroUser; ctx->dflags = 0; } @@ -48,6 +49,7 @@ void SetupKernelIOCtx(ioctx_t* ctx) ctx->gid = ctx->auth_gid = process->gid; ctx->copy_to_dest = CopyToKernel; ctx->copy_from_src = CopyFromKernel; + ctx->zero_dest = ZeroKernel; ctx->dflags = 0; }