syscalls: make a bunch of system calls use the new user memory operations

This commit is contained in:
Matheus
2022-12-15 10:19:58 -03:00
parent 30dd3d6ca3
commit 1ead72d897
12 changed files with 151 additions and 48 deletions
+12 -3
View File
@@ -3,6 +3,7 @@
#include <kernel/fd.h> #include <kernel/fd.h>
#include <arch/cls.h> #include <arch/cls.h>
#include <arch/spinlock.h> #include <arch/spinlock.h>
#include <kernel/ustring.h>
extern fs_t kerneltmpfs; extern fs_t kerneltmpfs;
@@ -67,6 +68,17 @@ syscallret syscall_accept(int sockfd, void* addr, socklen_t* addrlen){
retv.errno = socket_accept(&peer, listenersock, addr, addrlen, fd); retv.errno = socket_accept(&peer, listenersock, addr, addrlen, fd);
if(retv.errno)
goto _fail;
retv.errno = u_memcpy(addr, &peer->addr_un, peer->addrlen);
if(retv.errno)
goto _fail;
retv.errno = u_memcpy(addrlen, &peer->addrlen, sizeof(socklen_t));
if(retv.errno) if(retv.errno)
goto _fail; goto _fail;
@@ -90,9 +102,6 @@ syscallret syscall_accept(int sockfd, void* addr, socklen_t* addrlen){
retv.ret = connifd; retv.ret = connifd;
memcpy(addr, &peer->addr_un, peer->addrlen);
*addrlen = peer->addrlen;
return retv; return retv;
_fail: _fail:
+11 -2
View File
@@ -6,6 +6,7 @@
#include <arch/cls.h> #include <arch/cls.h>
#include <kernel/sched.h> #include <kernel/sched.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <kernel/ustring.h>
syscallret syscall_chdir(const char* path){ syscallret syscall_chdir(const char* path){
syscallret retv; syscallret retv;
@@ -17,10 +18,18 @@ syscallret syscall_chdir(const char* path){
return retv; return retv;
} }
size_t len = strlen(path); size_t len;
retv.errno = u_strlen(path, &len);
if(retv.errno)
return retv;
char buff[len+1]; char buff[len+1];
strcpy(buff, path); retv.errno = u_strcpy(buff, path);
if(retv.errno)
return retv;
proc_t* proc = arch_getcls()->thread->proc; proc_t* proc = arch_getcls()->thread->proc;
+11 -2
View File
@@ -4,6 +4,7 @@
#include <arch/cls.h> #include <arch/cls.h>
#include <kernel/fd.h> #include <kernel/fd.h>
#include <kernel/sched.h> #include <kernel/sched.h>
#include <kernel/ustring.h>
// flags is ignored for now // flags is ignored for now
@@ -17,11 +18,19 @@ syscallret syscall_fchmodat(int dirfd, const char* path, mode_t mode, int flags)
return retv; return retv;
} }
size_t len = strlen(path); size_t len;
retv.errno = u_strlen(path, &len);
if(retv.errno)
return retv;
char buff[len+1]; char buff[len+1];
strcpy(buff, path); retv.errno = u_strcpy(buff, path);
if(retv.errno)
return retv;
proc_t* proc = arch_getcls()->thread->proc; proc_t* proc = arch_getcls()->thread->proc;
+11 -2
View File
@@ -3,6 +3,7 @@
#include <kernel/sched.h> #include <kernel/sched.h>
#include <kernel/vmm.h> #include <kernel/vmm.h>
#include <arch/cls.h> #include <arch/cls.h>
#include <kernel/ustring.h>
syscallret syscall_chroot(const char* path){ syscallret syscall_chroot(const char* path){
@@ -14,11 +15,19 @@ syscallret syscall_chroot(const char* path){
return retv; return retv;
} }
size_t len = strlen(path); size_t len;
retv.errno = u_strlen(path, &len);
if(retv.errno)
return retv;
char buff[len+1]; char buff[len+1];
strcpy(buff, path); retv.errno = u_strcpy(buff, path);
if(retv.errno)
return retv;
proc_t* proc = arch_getcls()->thread->proc; proc_t* proc = arch_getcls()->thread->proc;
+3 -1
View File
@@ -3,6 +3,7 @@
#include <kernel/vmm.h> #include <kernel/vmm.h>
#include <time.h> #include <time.h>
#include <errno.h> #include <errno.h>
#include <kernel/ustring.h>
#define CLOCK_REALTIME 0 #define CLOCK_REALTIME 0
@@ -19,7 +20,8 @@ syscallret syscall_clock_gettime(int clockid, struct timespec *tp){
switch(clockid){ switch(clockid){
case CLOCK_REALTIME: case CLOCK_REALTIME:
*tp = arch_timekeeper_gettime(); struct timespec t = arch_timekeeper_gettime();
retv.errno = u_memcpy(tp, &t, sizeof(struct timespec));
break; break;
default: default:
retv.errno = EINVAL; retv.errno = EINVAL;
+26 -11
View File
@@ -9,6 +9,7 @@
#include <kernel/elf.h> #include <kernel/elf.h>
#include <arch/cls.h> #include <arch/cls.h>
#include <arch/interrupt.h> #include <arch/interrupt.h>
#include <kernel/ustring.h>
static void destroyvec(char* vec[], size_t vecsize){ static void destroyvec(char* vec[], size_t vecsize){
for(uintmax_t p = 0; p < vecsize; ++p){ for(uintmax_t p = 0; p < vecsize; ++p){
@@ -30,17 +31,28 @@ syscallret syscall_execve(const char* name, char* const argv[], char* const envp
return retv; return retv;
} }
size_t namelen = strlen(name); // XXX user strlen size_t namelen;
retv.errno = u_strlen(name, &namelen);
if(retv.errno)
return retv;
size_t argc = 0; size_t argc = 0;
size_t envc = 0; size_t envc = 0;
// this probably should be checked in a safer way while(1){
char* tmp;
while(argv[argc]){ retv.errno = u_memcpy(&tmp, &argv[argc], sizeof(argv[argc]));
if(!tmp)
break;
++argc; ++argc;
} }
while(envp[envc]){ while(1){
char* tmp;
retv.errno = u_memcpy(&tmp, &envp[envc], sizeof(envp[envc]));
if(!tmp)
break;
++envc; ++envc;
} }
@@ -66,28 +78,31 @@ syscallret syscall_execve(const char* name, char* const argv[], char* const envp
return retv; return retv;
} }
strcpy(namebuff, name); // XXX user strcpy int err = u_strcpy(namebuff, name);
int err = 0; // XXX
// this is still not that safe, later make it even safer.
for(uintmax_t arg = 0; arg < argc && err == 0; ++arg){ for(uintmax_t arg = 0; arg < argc && err == 0; ++arg){
size_t len = strlen(argv[arg]); // XXX user strlen size_t len;
err = u_strlen(argv[arg], &len);
argbuff[arg] = alloc(len+1); argbuff[arg] = alloc(len+1);
if(!argbuff[arg]){ if(!argbuff[arg]){
err = ENOMEM; err = ENOMEM;
break; break;
} }
strcpy(argbuff[arg], argv[arg]); // XXX user strcpy u_strcpy(argbuff[arg], argv[arg]);
} }
for(uintmax_t env = 0; env < envc && err == 0; ++env){ for(uintmax_t env = 0; env < envc && err == 0; ++env){
size_t len = strlen(envp[env]); // XXX user strlen size_t len;
u_strlen(envp[env], &len);
envbuff[env] = alloc(len+1); envbuff[env] = alloc(len+1);
if(!envbuff[env]){ if(!envbuff[env]){
err = ENOMEM; err = ENOMEM;
break; break;
} }
strcpy(envbuff[env], envp[env]); // XXX user strcpy u_strcpy(envbuff[env], envp[env]);
} }
if(err){ if(err){
+6 -2
View File
@@ -26,10 +26,14 @@ syscallret syscall_fstat(int ifd, stat* st){
return retv; return retv;
} }
memcpy(st, &fd->node->st, sizeof(stat)); // XXX user memcpy
fd_release(fd); fd_release(fd);
retv.errno = u_memcpy(st, &fd->node->st, sizeof(stat));
if(retv.errno)
return retv;
retv.errno = 0; retv.errno = 0;
retv.ret = 0; retv.ret = 0;
+14 -6
View File
@@ -5,6 +5,7 @@
#include <kernel/vfs.h> #include <kernel/vfs.h>
#include <arch/spinlock.h> #include <arch/spinlock.h>
#include <string.h> #include <string.h>
#include <kernel/ustring.h>
// we don't care about flags yet // we don't care about flags yet
@@ -17,11 +18,19 @@ syscallret syscall_fstatat(int ifd, char* path, stat* st, int flags){
return retv; return retv;
} }
size_t len = strlen(path); size_t len;
retv.errno = u_strlen(path, &len);
if(retv.errno)
return retv;
char buff[len+1]; char buff[len+1];
strcpy(buff, path); retv.errno = u_strcpy(buff, path);
if(retv.errno)
return retv;
proc_t* proc = arch_getcls()->thread->proc; proc_t* proc = arch_getcls()->thread->proc;
@@ -57,12 +66,11 @@ syscallret syscall_fstatat(int ifd, char* path, stat* st, int flags){
if(retv.errno) if(retv.errno)
goto _fail; goto _fail;
memcpy(st, &node->st, sizeof(stat)); // XXX user memcpy
vfs_close(node); vfs_close(node);
retv.ret = 0; retv.errno = u_memcpy(st, &node->st, sizeof(stat));
retv.ret = retv.errno ? -1 : 0;
_fail: _fail:
+7 -1
View File
@@ -3,6 +3,7 @@
#include <arch/cls.h> #include <arch/cls.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <kernel/vmm.h> #include <kernel/vmm.h>
#include <kernel/ustring.h>
syscallret syscall_getdirent(int ifd, void* buff, size_t max_size){ syscallret syscall_getdirent(int ifd, void* buff, size_t max_size){
syscallret retv; syscallret retv;
@@ -42,7 +43,12 @@ syscallret syscall_getdirent(int ifd, void* buff, size_t max_size){
retv.ret *= sizeof(dent_t); retv.ret *= sizeof(dent_t);
memcpy(buff, kbuff, retv.ret); // XXX use user memcpy retv.errno = u_memcpy(buff, kbuff, retv.ret);
if(retv.errno){
retv.ret = -1;
return retv;
}
fd_release(fd); fd_release(fd);
+20 -4
View File
@@ -5,6 +5,7 @@
#include <kernel/fd.h> #include <kernel/fd.h>
#include <kernel/sched.h> #include <kernel/sched.h>
#include <string.h> #include <string.h>
#include <kernel/ustring.h>
static int gettarget(fd_t** targ, dirnode_t** targnode, int ifd, proc_t* proc){ static int gettarget(fd_t** targ, dirnode_t** targnode, int ifd, proc_t* proc){
@@ -44,14 +45,29 @@ syscallret syscall_linkat(int srcdirfd, const char* srcpath, int tgtdirfd, const
return retv; return retv;
} }
size_t srclen = strlen(srcpath); size_t srclen;
size_t tgtlen = strlen(tgtpath); size_t tgtlen;
retv.errno = u_strlen(srcpath, &srclen);
if(retv.errno)
return retv;
retv.errno = u_strlen(tgtpath, &tgtlen);
if(retv.errno)
return retv;
char srcbuff[srclen+1]; char srcbuff[srclen+1];
char tgtbuff[tgtlen+1]; char tgtbuff[tgtlen+1];
strcpy(srcbuff, srcpath);
strcpy(tgtbuff, tgtpath);
retv.errno = u_strcpy(srcbuff, srcpath);
if(retv.errno)
return retv;
retv.errno = u_strcpy(tgtbuff, tgtpath);
if(retv.errno)
return retv;
proc_t* proc = arch_getcls()->thread->proc; proc_t* proc = arch_getcls()->thread->proc;
+14 -2
View File
@@ -3,6 +3,7 @@
#include <arch/cls.h> #include <arch/cls.h>
#include <string.h> #include <string.h>
#include <sys/types.h> #include <sys/types.h>
#include <kernel/ustring.h>
syscallret syscall_mkdirat(int dirfd, const char* pathname, mode_t mode){ syscallret syscall_mkdirat(int dirfd, const char* pathname, mode_t mode){
syscallret retv; syscallret retv;
@@ -15,9 +16,20 @@ syscallret syscall_mkdirat(int dirfd, const char* pathname, mode_t mode){
proc_t* proc = arch_getcls()->thread->proc; proc_t* proc = arch_getcls()->thread->proc;
char path[strlen(pathname)+1]; size_t len;
strcpy(path, pathname); retv.errno = u_strlen(pathname, &len);
if(retv.errno)
return retv;
char path[len+1];
retv.errno = u_strcpy(path, pathname);
if(retv.errno)
return retv;
dirnode_t* target; dirnode_t* target;
fd_t* targetfd; fd_t* targetfd;
+14 -10
View File
@@ -7,6 +7,8 @@
#include <errno.h> #include <errno.h>
#include <kernel/alloc.h> #include <kernel/alloc.h>
#include <stddef.h> #include <stddef.h>
#include <string.h>
#include <kernel/ustring.h>
syscallret syscall_openat(int dirfd, const char* pathname, int flags, mode_t mode){ syscallret syscall_openat(int dirfd, const char* pathname, int flags, mode_t mode){
syscallret retv; syscallret retv;
@@ -17,13 +19,19 @@ syscallret syscall_openat(int dirfd, const char* pathname, int flags, mode_t mod
return retv; return retv;
} }
const char* name = alloc(strlen(pathname) + 1); // XXX use an user specific strlen func size_t len;
if(!name){
retv.errno = ENOMEM;
return retv;
}
strcpy(name, pathname); // XXX use an user specific strcpy retv.errno = u_strlen(pathname, &len);
if(retv.errno)
return retv;
char name[len+1];
retv.errno = u_strcpy(name, pathname);
if(retv.errno)
return retv;
proc_t* proc = arch_getcls()->thread->proc; proc_t* proc = arch_getcls()->thread->proc;
@@ -34,7 +42,6 @@ syscallret syscall_openat(int dirfd, const char* pathname, int flags, mode_t mod
if(err){ if(err){
retv.errno = err; retv.errno = err;
free(name);
return retv; return retv;
} }
@@ -47,7 +54,6 @@ syscallret syscall_openat(int dirfd, const char* pathname, int flags, mode_t mod
if(err){ if(err){
retv.errno = err; retv.errno = err;
free(name);
fd_release(fd); fd_release(fd);
fd_free(&proc->fdtable, fd); fd_free(&proc->fdtable, fd);
return retv; return retv;
@@ -106,7 +112,6 @@ syscallret syscall_openat(int dirfd, const char* pathname, int flags, mode_t mod
fd_release(fd); fd_release(fd);
free(name);
retv.errno = 0; retv.errno = 0;
retv.ret = ifd; retv.ret = ifd;
@@ -122,7 +127,6 @@ syscallret syscall_openat(int dirfd, const char* pathname, int flags, mode_t mod
fd_release(fd); fd_release(fd);
fd_free(&proc->fdtable, fd); fd_free(&proc->fdtable, fd);
free(name);
return retv; return retv;
} }