Page MenuHomeFreeBSD

D59591.id186467.diff
No OneTemporary

D59591.id186467.diff

diff --git a/sys/geom/geom_ctl.c b/sys/geom/geom_ctl.c
--- a/sys/geom/geom_ctl.c
+++ b/sys/geom/geom_ctl.c
@@ -39,6 +39,7 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/conf.h>
+#include <sys/fcntl.h>
#include <sys/malloc.h>
#include <sys/sbuf.h>
#include <sys/stdarg.h>
@@ -552,18 +553,28 @@
g_free(gps);
}
+struct g_ctl_req_args {
+ struct gctl_req *req;
+ int fflag;
+};
+
static void
g_ctl_req(void *arg, int flag __unused)
{
+ struct g_ctl_req_args *args = arg;
+ struct gctl_req *req = args->req;
struct g_class *mp;
- struct gctl_req *req;
char const *verb;
+ int fflag = args->fflag;
g_topology_assert();
- req = arg;
mp = gctl_get_class(req, "class");
if (mp == NULL)
return;
+ if ((fflag & FREAD) == 0) {
+ gctl_error(req, "Permission denied");
+ return;
+ }
verb = gctl_get_param(req, "verb", NULL);
if (verb == NULL) {
gctl_error(req, "Verb missing");
@@ -574,18 +585,22 @@
} else if (mp->ctlreq == NULL) {
gctl_error(req, "Class takes no requests");
} else {
+ if ((fflag & FWRITE) == 0) {
+ gctl_error(req, "Permission denied");
+ return;
+ }
mp->ctlreq(req, mp, verb);
}
g_topology_assert();
}
static int
-g_ctl_ioctl_ctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread *td)
+g_ctl_ioctl_ctl(struct cdev *dev, u_long cmd, void *data, int fflag, struct thread *td)
{
- struct gctl_req *req;
+ struct g_ctl_req_args args = { .req = data, .fflag = fflag };
+ struct gctl_req *req = data;
int nerror;
- req = (void *)data;
req->nerror = 0;
/* It is an error if we cannot return an error text */
if (req->lerror < 2)
@@ -606,7 +621,7 @@
gctl_dump(req, "request");
if (!req->nerror) {
- g_waitfor_event(g_ctl_req, req, M_WAITOK, NULL);
+ g_waitfor_event(g_ctl_req, &args, M_WAITOK, NULL);
if (g_debugflags & G_F_CTLDUMP)
gctl_dump(req, "result");
@@ -631,9 +646,9 @@
{
int error;
- switch(cmd) {
+ switch (cmd) {
case GEOM_CTL:
- error = g_ctl_ioctl_ctl(dev, cmd, data, fflag, td);
+ error = g_ctl_ioctl_ctl(dev, cmd, (void *)data, fflag, td);
break;
default:
error = ENOIOCTL;

File Metadata

Mime Type
text/plain
Expires
Sat, Sep 12, 3:56 PM (11 m, 52 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
38798706
Default Alt Text
D59591.id186467.diff (2 KB)

Event Timeline