mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 15:08:21 +00:00
vfs: pass cred to ioctl
This commit is contained in:
@@ -202,12 +202,12 @@ int devfs_isatty(vnode_t *node) {
|
|||||||
return devnode->devops->isatty ? devnode->devops->isatty(devnode->attr.rdevminor) : ENOTTY;
|
return devnode->devops->isatty ? devnode->devops->isatty(devnode->attr.rdevminor) : ENOTTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
int devfs_ioctl(vnode_t *node, unsigned long request, void *arg, int *ret) {
|
int devfs_ioctl(vnode_t *node, unsigned long request, void *arg, int *ret, cred_t *cred) {
|
||||||
devnode_t *devnode = (devnode_t *)node;
|
devnode_t *devnode = (devnode_t *)node;
|
||||||
if (devnode->master)
|
if (devnode->master)
|
||||||
devnode = devnode->master;
|
devnode = devnode->master;
|
||||||
|
|
||||||
return devnode->devops->ioctl ? devnode->devops->ioctl(devnode->attr.rdevminor, request, arg, ret) : ENOTTY;
|
return devnode->devops->ioctl ? devnode->devops->ioctl(devnode->attr.rdevminor, request, arg, ret, cred) : ENOTTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
int devfs_maxseek(vnode_t *node, size_t *max) {
|
int devfs_maxseek(vnode_t *node, size_t *max) {
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ int sockfs_setattr(vnode_t *node, vattr_t *attr, int which, cred_t *cred) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// arg can be in userspace
|
// arg can be in userspace
|
||||||
int sockfs_ioctl(vnode_t *node, unsigned long request, void *arg, int *result) {
|
int sockfs_ioctl(vnode_t *node, unsigned long request, void *arg, int *result, cred_t *cred) {
|
||||||
switch (request) {
|
switch (request) {
|
||||||
case SIOCSIFADDR: {
|
case SIOCSIFADDR: {
|
||||||
ifreq_t ifreq;
|
ifreq_t ifreq;
|
||||||
@@ -80,7 +80,7 @@ int sockfs_ioctl(vnode_t *node, unsigned long request, void *arg, int *result) {
|
|||||||
return e;
|
return e;
|
||||||
|
|
||||||
netdev_t *netdev = netdev_getdev(ifreq.name);
|
netdev_t *netdev = netdev_getdev(ifreq.name);
|
||||||
if(netdev) {
|
if (netdev) {
|
||||||
sockaddr_t sockaddr;
|
sockaddr_t sockaddr;
|
||||||
e = sock_convertaddress(&sockaddr, &ifreq.addr);
|
e = sock_convertaddress(&sockaddr, &ifreq.addr);
|
||||||
if (e)
|
if (e)
|
||||||
|
|||||||
+2
-2
@@ -258,7 +258,7 @@ int vfs_write(vnode_t *node, void *buffer, size_t size, uintmax_t offset, size_t
|
|||||||
// else just get the disk size and limit the read size
|
// else just get the disk size and limit the read size
|
||||||
blockdesc_t blockdesc;
|
blockdesc_t blockdesc;
|
||||||
int r;
|
int r;
|
||||||
err = VOP_IOCTL(node, BLOCK_IOCTL_GETDESC, &blockdesc, &r);
|
err = VOP_IOCTL(node, BLOCK_IOCTL_GETDESC, &blockdesc, &r, NULL);
|
||||||
__assert(err == 0);
|
__assert(err == 0);
|
||||||
|
|
||||||
size_t bytesize = blockdesc.blockcapacity * blockdesc.blocksize;
|
size_t bytesize = blockdesc.blockcapacity * blockdesc.blocksize;
|
||||||
@@ -352,7 +352,7 @@ int vfs_read(vnode_t *node, void *buffer, size_t size, uintmax_t offset, size_t
|
|||||||
} else {
|
} else {
|
||||||
blockdesc_t blockdesc;
|
blockdesc_t blockdesc;
|
||||||
int r;
|
int r;
|
||||||
err = VOP_IOCTL(node, BLOCK_IOCTL_GETDESC, &blockdesc, &r);
|
err = VOP_IOCTL(node, BLOCK_IOCTL_GETDESC, &blockdesc, &r, NULL);
|
||||||
__assert(err == 0);
|
__assert(err == 0);
|
||||||
|
|
||||||
nodesize = blockdesc.blockcapacity * blockdesc.blocksize;
|
nodesize = blockdesc.blockcapacity * blockdesc.blocksize;
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ typedef struct {
|
|||||||
int (*mmap)(int minor, void *addr, uintmax_t offset, int flags);
|
int (*mmap)(int minor, void *addr, uintmax_t offset, int flags);
|
||||||
int (*munmap)(int minor, void *addr, uintmax_t offset, int flags);
|
int (*munmap)(int minor, void *addr, uintmax_t offset, int flags);
|
||||||
int (*isatty)(int minor);
|
int (*isatty)(int minor);
|
||||||
int (*ioctl)(int minor, unsigned long request, void *arg, int *result);
|
int (*ioctl)(int minor, unsigned long request, void *arg, int *result, cred_t *cred);
|
||||||
int (*maxseek)(int minor, size_t *max);
|
int (*maxseek)(int minor, size_t *max);
|
||||||
void (*inactive)(int minor);
|
void (*inactive)(int minor);
|
||||||
} devops_t;
|
} devops_t;
|
||||||
|
|||||||
@@ -36,6 +36,6 @@ void tty_init();
|
|||||||
tty_t *tty_create(char *name, ttydevicewritefn_t writefn, ttyinactivefn_t inactivefn, void *internal);
|
tty_t *tty_create(char *name, ttydevicewritefn_t writefn, ttyinactivefn_t inactivefn, void *internal);
|
||||||
void tty_process(tty_t *tty, char c);
|
void tty_process(tty_t *tty, char c);
|
||||||
void tty_unregister(tty_t *tty);
|
void tty_unregister(tty_t *tty);
|
||||||
int tty_ioctl(tty_t *tty, unsigned long req, void *arg, int *result);
|
int tty_ioctl(tty_t *tty, unsigned long req, void *arg, int *result, cred_t *cred);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ typedef struct vops_t {
|
|||||||
int (*munmap)(vnode_t *node, void *addr, uintmax_t offset, int flags, cred_t *cred);
|
int (*munmap)(vnode_t *node, void *addr, uintmax_t offset, int flags, cred_t *cred);
|
||||||
int (*getdents)(vnode_t *node, dent_t *buffer, size_t count, uintmax_t offset, size_t *readcount);
|
int (*getdents)(vnode_t *node, dent_t *buffer, size_t count, uintmax_t offset, size_t *readcount);
|
||||||
int (*isatty)(vnode_t *node);
|
int (*isatty)(vnode_t *node);
|
||||||
int (*ioctl)(vnode_t *node, unsigned long request, void *arg, int *result);
|
int (*ioctl)(vnode_t *node, unsigned long request, void *arg, int *result, cred_t *cred);
|
||||||
int (*maxseek)(vnode_t *node, size_t *max);
|
int (*maxseek)(vnode_t *node, size_t *max);
|
||||||
int (*resize)(vnode_t *node, size_t newsize, cred_t *cred);
|
int (*resize)(vnode_t *node, size_t newsize, cred_t *cred);
|
||||||
int (*rename)(vnode_t *sourcedir, vnode_t *source, char *oldname, vnode_t *targetdir, vnode_t *target, char *newname, int flags);
|
int (*rename)(vnode_t *sourcedir, vnode_t *source, char *oldname, vnode_t *targetdir, vnode_t *target, char *newname, int flags);
|
||||||
@@ -189,7 +189,7 @@ typedef struct vops_t {
|
|||||||
#define VOP_GETDENTS(v, b, c, o, rc) (v)->ops->getdents(v, b, c, o, rc)
|
#define VOP_GETDENTS(v, b, c, o, rc) (v)->ops->getdents(v, b, c, o, rc)
|
||||||
#define VOP_POLL(v, d, p) (v)->ops->poll(v, d, p)
|
#define VOP_POLL(v, d, p) (v)->ops->poll(v, d, p)
|
||||||
#define VOP_ISATTY(v) ((v)->ops->isatty ? (v)->ops->isatty(v) : ENOTTY)
|
#define VOP_ISATTY(v) ((v)->ops->isatty ? (v)->ops->isatty(v) : ENOTTY)
|
||||||
#define VOP_IOCTL(v, r, a, rp) ((v)->ops->ioctl ? (v)->ops->ioctl(v, r, a, rp) : ENOTTY)
|
#define VOP_IOCTL(v, r, a, rp, c) ((v)->ops->ioctl ? (v)->ops->ioctl(v, r, a, rp, c) : ENOTTY)
|
||||||
#define VOP_MAXSEEK(v, rp) ((v)->ops->maxseek ? (v)->ops->maxseek(v, rp) : ENOTTY)
|
#define VOP_MAXSEEK(v, rp) ((v)->ops->maxseek ? (v)->ops->maxseek(v, rp) : ENOTTY)
|
||||||
#define VOP_RESIZE(v, s, c) (v)->ops->resize(v, s, c)
|
#define VOP_RESIZE(v, s, c) (v)->ops->resize(v, s, c)
|
||||||
#define VOP_RENAME(sd, s, o, td, t, n, f) (s)->ops->rename(sd, s, o, td, t, n, f)
|
#define VOP_RENAME(sd, s, o, td, t, n, f) (s)->ops->rename(sd, s, o, td, t, n, f)
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ static int write(int minor, void *buffer, size_t size, uintmax_t offset, int fla
|
|||||||
return rwblock(minor, buffer, size, offset, flags, true, writec);
|
return rwblock(minor, buffer, size, offset, flags, true, writec);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ioctl(int minor, unsigned long request, void *arg, int *result) {
|
static int ioctl(int minor, unsigned long request, void *arg, int *result, cred_t *cred) {
|
||||||
blockdesc_t *desc = getdesc(minor);
|
blockdesc_t *desc = getdesc(minor);
|
||||||
if (desc == NULL)
|
if (desc == NULL)
|
||||||
return ENODEV;
|
return ENODEV;
|
||||||
|
|||||||
+1
-1
@@ -169,7 +169,7 @@ static int munmap(int minor, void *addr, uintmax_t offset, int flags) {
|
|||||||
#define FBIOGET_FSCREENINFO 0x4602
|
#define FBIOGET_FSCREENINFO 0x4602
|
||||||
#define FBIOBLANK 0x4611
|
#define FBIOBLANK 0x4611
|
||||||
|
|
||||||
static int ioctl(int minor, unsigned long request, void *arg, int *result){
|
static int ioctl(int minor, unsigned long request, void *arg, int *result, cred_t *cred){
|
||||||
if (minor >= count)
|
if (minor >= count)
|
||||||
return ENODEV;
|
return ENODEV;
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -192,7 +192,7 @@ static int poll(int minor, polldata_t *data, int events) {
|
|||||||
return revents;
|
return revents;
|
||||||
}
|
}
|
||||||
#define TIOCGPTN 0x80045430
|
#define TIOCGPTN 0x80045430
|
||||||
static int ioctl(int minor, unsigned long request, void *_arg, int *result) {
|
static int ioctl(int minor, unsigned long request, void *_arg, int *result, cred_t *cred) {
|
||||||
pty_t *pty = ptyget(minor);
|
pty_t *pty = ptyget(minor);
|
||||||
if (pty == NULL)
|
if (pty == NULL)
|
||||||
return ENODEV;
|
return ENODEV;
|
||||||
@@ -202,7 +202,7 @@ static int ioctl(int minor, unsigned long request, void *_arg, int *result) {
|
|||||||
return USERCOPY_POSSIBLY_TO_USER(_arg, &pty->minor, sizeof(int));
|
return USERCOPY_POSSIBLY_TO_USER(_arg, &pty->minor, sizeof(int));
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return tty_ioctl(pty->tty, request, _arg, result);
|
return tty_ioctl(pty->tty, request, _arg, result, cred);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
+3
-3
@@ -299,7 +299,7 @@ static int poll(int minor, polldata_t *data, int events) {
|
|||||||
#define TTY_IOCTL_NAME 0x771101141113l
|
#define TTY_IOCTL_NAME 0x771101141113l
|
||||||
#define TTY_NAME_MAX 32
|
#define TTY_NAME_MAX 32
|
||||||
|
|
||||||
int tty_ioctl(tty_t *tty, unsigned long req, void *arg, int *result) {
|
int tty_ioctl(tty_t *tty, unsigned long req, void *arg, int *result, cred_t *cred) {
|
||||||
switch (req) {
|
switch (req) {
|
||||||
case TIOCGWINSZ:
|
case TIOCGWINSZ:
|
||||||
return USERCOPY_POSSIBLY_TO_USER(arg, &tty->winsize, sizeof(winsize_t));
|
return USERCOPY_POSSIBLY_TO_USER(arg, &tty->winsize, sizeof(winsize_t));
|
||||||
@@ -359,12 +359,12 @@ int tty_ioctl(tty_t *tty, unsigned long req, void *arg, int *result) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ioctl(int minor, unsigned long req, void *arg, int *result) {
|
static int ioctl(int minor, unsigned long req, void *arg, int *result, cred_t *cred) {
|
||||||
tty_t *tty = ttyget(minor);
|
tty_t *tty = ttyget(minor);
|
||||||
if (tty == NULL)
|
if (tty == NULL)
|
||||||
return ENODEV;
|
return ENODEV;
|
||||||
|
|
||||||
return tty_ioctl(tty, req, arg, result);
|
return tty_ioctl(tty, req, arg, result, cred);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int isatty(int minor) {
|
static int isatty(int minor) {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ syscallret_t syscall_ioctl(context_t *, int fd, unsigned long request, void *arg
|
|||||||
|
|
||||||
int r = 0;
|
int r = 0;
|
||||||
VOP_LOCK(file->vnode);
|
VOP_LOCK(file->vnode);
|
||||||
ret.errno = VOP_IOCTL(file->vnode, request, arg, &r);
|
ret.errno = VOP_IOCTL(file->vnode, request, arg, &r, &_cpu()->thread->proc->cred);
|
||||||
VOP_UNLOCK(file->vnode);
|
VOP_UNLOCK(file->vnode);
|
||||||
ret.ret = ret.errno ? -1 : r;
|
ret.ret = ret.errno ? -1 : r;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user