getsockname: fix unsafe pointer dereference

This commit is contained in:
Matheus
2024-06-17 20:30:43 -03:00
parent eea9cab357
commit 9eba220859
+13 -3
View File
@@ -1,11 +1,18 @@
#include <kernel/syscalls.h> #include <kernel/syscalls.h>
#include <kernel/sock.h> #include <kernel/sock.h>
syscallret_t syscall_getsockname(context_t *, int fd, void *uaddr, int *addrlen) { syscallret_t syscall_getsockname(context_t *, int fd, void *uaddr, int *uaddrlen) {
syscallret_t ret = { syscallret_t ret = {
.ret = -1 .ret = -1
}; };
int addrlen;
ret.errno = usercopy_fromuser(&addrlen, uaddrlen, sizeof(addrlen));
if (ret.errno)
return ret;
addrlen = min(addrlen, sizeof(abisockaddr_t));
file_t *file = fd_get(fd); file_t *file = fd_get(fd);
if (file == NULL) { if (file == NULL) {
ret.errno = EBADF; ret.errno = EBADF;
@@ -30,11 +37,14 @@ syscallret_t syscall_getsockname(context_t *, int fd, void *uaddr, int *addrlen)
if (ret.errno) if (ret.errno)
goto cleanup; goto cleanup;
ret.errno = usercopy_touser(uaddr, &abisockaddr, min(*addrlen, sizeof(abisockaddr_t))); ret.errno = usercopy_touser(uaddr, &abisockaddr, addrlen);
if (ret.errno)
goto cleanup;
ret.errno = usercopy_touser(uaddrlen, &addrlen, sizeof(addrlen));
if (ret.errno) if (ret.errno)
goto cleanup; goto cleanup;
*addrlen = sizeof(abisockaddr_t);
ret.ret = 0; ret.ret = 0;
cleanup: cleanup: