diff --git a/kernel-src/include/kernel/sock.h b/kernel-src/include/kernel/sock.h index de01b51a..930b3ff2 100644 --- a/kernel-src/include/kernel/sock.h +++ b/kernel-src/include/kernel/sock.h @@ -36,7 +36,7 @@ typedef struct socketops_t { int (*send)(socket_t *socket, sockaddr_t *addr, void *buffer, size_t count, uintmax_t flags, size_t *sendcount); int (*recv)(socket_t *socket, sockaddr_t *addr, void *buffer, size_t count, uintmax_t flags, size_t *recvcount); int (*poll)(socket_t *socket, polldata_t *data, int events); - int (*connect)(socket_t *socket, sockaddr_t *addr, uintmax_t data); + int (*connect)(socket_t *socket, sockaddr_t *addr, uintmax_t data, cred_t *cred); int (*listen)(socket_t *socket, int backlog); int (*accept)(socket_t *server, socket_t *client, sockaddr_t *addr, uintmax_t flags); int (*getname)(socket_t *socket, sockaddr_t *addr); diff --git a/kernel-src/io/net/localsocket.c b/kernel-src/io/net/localsocket.c index 3e4563ff..1e20a2ce 100644 --- a/kernel-src/io/net/localsocket.c +++ b/kernel-src/io/net/localsocket.c @@ -384,7 +384,7 @@ static int localsock_accept(socket_t *_server, socket_t *_clientconnection, sock return error; } -static int localsock_connect(socket_t *socket, sockaddr_t *addr, uintmax_t flags) { +static int localsock_connect(socket_t *socket, sockaddr_t *addr, uintmax_t flags, cred_t *cred) { localsocket_t *localsocket = (localsocket_t *)socket; int error; vnode_t *refnode = NULL; @@ -416,6 +416,11 @@ static int localsock_connect(socket_t *socket, sockaddr_t *addr, uintmax_t flags goto leave; } + // and we have write access + error = VOP_ACCESS(result, V_ACCESS_WRITE, cred); + if (error) + goto leave; + // and if it has a valid binding binding = result->socketbinding; if (binding == NULL) { diff --git a/kernel-src/sys/syscalls/connect.c b/kernel-src/sys/syscalls/connect.c index a56ad907..4a2db571 100644 --- a/kernel-src/sys/syscalls/connect.c +++ b/kernel-src/sys/syscalls/connect.c @@ -47,7 +47,7 @@ syscallret_t syscall_connect(context_t *, int fd, abisockaddr_t *uaddr, size_t a socket_t *socket = SOCKFS_SOCKET_FROM_NODE(file->vnode); - ret.errno = socket->ops->connect ? socket->ops->connect(socket, &sockaddr, fileflagstovnodeflags(file->flags)) : EOPNOTSUPP; + ret.errno = socket->ops->connect ? socket->ops->connect(socket, &sockaddr, fileflagstovnodeflags(file->flags), &_cpu()->thread->proc->cred) : EOPNOTSUPP; ret.ret = ret.errno ? -1 : 0; cleanup: