From 98c5963893332f6df1c015364fd6a7fcde687524 Mon Sep 17 00:00:00 2001 From: Matheus Date: Wed, 12 Jun 2024 19:09:03 -0300 Subject: [PATCH] accept: return address --- kernel-src/sys/syscalls/accept.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/kernel-src/sys/syscalls/accept.c b/kernel-src/sys/syscalls/accept.c index ac71f898..a585d5e7 100644 --- a/kernel-src/sys/syscalls/accept.c +++ b/kernel-src/sys/syscalls/accept.c @@ -3,12 +3,18 @@ #include #include -// TODO handle abisockaddr -syscallret_t syscall_accept(context_t *, int oldfd, abisockaddr_t *abisockaddr, int *addrlen, int acceptflags) { +syscallret_t syscall_accept(context_t *, int oldfd, abisockaddr_t *abisockaddr, int *uaddrlen, int acceptflags) { syscallret_t ret = { .ret = -1 }; + int addrlen = 0; + if (abisockaddr) { + ret.errno = usercopy_fromuser(&addrlen, uaddrlen, sizeof(int)); + if (ret.errno) + return ret; + } + file_t *oldfile = fd_get(oldfd); if (oldfile == NULL) { ret.errno = EBADF; @@ -58,6 +64,16 @@ syscallret_t syscall_accept(context_t *, int oldfd, abisockaddr_t *abisockaddr, newfile->offset = 0; newfile->mode = 0777; + abisockaddr_t tmpabiaddr; + __assert(sock_addrtoabiaddr(client->type, &addr, &tmpabiaddr) == 0); + addrlen = min(addrlen, sizeof(abisockaddr_t)); + + if (abisockaddr != NULL && (usercopy_touser(abisockaddr, &tmpabiaddr, addrlen) || usercopy_touser(uaddrlen, &addrlen, sizeof(addrlen)))) { + ret.errno = EFAULT; + fd_close(newfd); + goto cleanup; + } + ret.ret = newfd; cleanup: