From c17a2f4c6cae5eacd327e54eb927b5b20bc2d189 Mon Sep 17 00:00:00 2001 From: Matheus Date: Tue, 13 Dec 2022 23:41:40 -0300 Subject: [PATCH] kernel: user safe strlen --- src/arch/x86_64/Makefile | 7 ++++++- src/arch/x86_64/ustring.asm | 19 +++++++++++++++++++ src/include/kernel/sched.h | 2 ++ src/include/kernel/ustring.h | 9 +++++++++ src/sys/ustring.c | 19 +++++++++++++++++++ 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/arch/x86_64/ustring.asm create mode 100644 src/include/kernel/ustring.h create mode 100644 src/sys/ustring.c diff --git a/src/arch/x86_64/Makefile b/src/arch/x86_64/Makefile index ef5c74e6..91757044 100644 --- a/src/arch/x86_64/Makefile +++ b/src/arch/x86_64/Makefile @@ -1,4 +1,4 @@ -objects := $(patsubst %.c,%.o,$(wildcard *.c)) israsm.o context.o syscall.o sched.o +objects := $(patsubst %.c,%.o,$(wildcard *.c)) israsm.o context.o syscall.o sched.o ustringasm.o subdirs=boot OBJPATH=$(OBJDIR)/arch/${TARGET}/ export @@ -27,3 +27,8 @@ sched.o: sched.asm nasm -f elf64 -o $@ $< mkdir -p $(OBJPATH) cp $@ $(OBJPATH)/$@ + +ustringasm.o: ustring.asm + nasm -f elf64 -o $@ $< + mkdir -p $(OBJPATH) + cp $@ $(OBJPATH)/$@ diff --git a/src/arch/x86_64/ustring.asm b/src/arch/x86_64/ustring.asm new file mode 100644 index 00000000..346f5c54 --- /dev/null +++ b/src/arch/x86_64/ustring.asm @@ -0,0 +1,19 @@ +section .text: + +global arch_u_strlen +global arch_u_strlen_cont + +arch_u_strlen: + xor rcx, rcx + .loop: + cmp byte [rdi],0 + je .done + inc rcx + inc rdi + .done: + mov [rsi], rcx + xor rax, rax + ret +arch_u_strlen_cont: + mov rax, 1 + ret diff --git a/src/include/kernel/sched.h b/src/include/kernel/sched.h index 4e18b099..21829e07 100644 --- a/src/include/kernel/sched.h +++ b/src/include/kernel/sched.h @@ -42,6 +42,8 @@ typedef struct _thread_t{ vmm_context* ctx; pid_t tid; int priority; + int umemoperror; + void (*umemopfailaddr)(); } thread_t; typedef struct _proc_t{ diff --git a/src/include/kernel/ustring.h b/src/include/kernel/ustring.h new file mode 100644 index 00000000..67098a1c --- /dev/null +++ b/src/include/kernel/ustring.h @@ -0,0 +1,9 @@ +#ifndef _USTRING_H_INCLUDE +#define _USTRING_H_INCLUDE + +#include + +int u_strlen(const char* str, size_t* size); + + +#endif diff --git a/src/sys/ustring.c b/src/sys/ustring.c new file mode 100644 index 00000000..8505fa12 --- /dev/null +++ b/src/sys/ustring.c @@ -0,0 +1,19 @@ +#include +#include + +extern void arch_u_strlen_cont(); +extern int arch_u_strlen(const char* str, size_t* len); + +int u_strlen(const char* str, size_t* len){ + + arch_getcls()->thread->umemopfailaddr = arch_u_strlen_cont; + + int ret = arch_u_strlen(str, len); + + arch_getcls()->thread->umemopfailaddr = NULL; + + return ret == 0 ? 0 : arch_getcls()->thread->umemoperror; + +} + +