mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-02 07:28:21 +00:00
localsock: check for file permissions
This commit is contained in:
@@ -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 (*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 (*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 (*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 (*listen)(socket_t *socket, int backlog);
|
||||||
int (*accept)(socket_t *server, socket_t *client, sockaddr_t *addr, uintmax_t flags);
|
int (*accept)(socket_t *server, socket_t *client, sockaddr_t *addr, uintmax_t flags);
|
||||||
int (*getname)(socket_t *socket, sockaddr_t *addr);
|
int (*getname)(socket_t *socket, sockaddr_t *addr);
|
||||||
|
|||||||
@@ -384,7 +384,7 @@ static int localsock_accept(socket_t *_server, socket_t *_clientconnection, sock
|
|||||||
return error;
|
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;
|
localsocket_t *localsocket = (localsocket_t *)socket;
|
||||||
int error;
|
int error;
|
||||||
vnode_t *refnode = NULL;
|
vnode_t *refnode = NULL;
|
||||||
@@ -416,6 +416,11 @@ static int localsock_connect(socket_t *socket, sockaddr_t *addr, uintmax_t flags
|
|||||||
goto leave;
|
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
|
// and if it has a valid binding
|
||||||
binding = result->socketbinding;
|
binding = result->socketbinding;
|
||||||
if (binding == NULL) {
|
if (binding == NULL) {
|
||||||
|
|||||||
@@ -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);
|
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;
|
ret.ret = ret.errno ? -1 : 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
|||||||
Reference in New Issue
Block a user